1、概述java
什麼是jvm調優呢?jvm調優就是根據gc日誌分析jvm內存分配、回收的狀況來調整各區域內存比例或者gc回收的策略;更深一層就是根據dump出來的內存結構和線程棧來分析代碼中不合理的地方給予改進。eclipse優化主要涉及的是前者,經過gc日誌來分析。本文主要是經過分析eclipse gc日誌爲例來示例如何根據gc日誌來分析jvm內存而進行調優,像根據關閉eclipse啓動項、關閉各類校驗等措施來優化eclipse本文再也不闡述,網上有不少,本次測試的eclipse已經進行了配置上面的優化。app
2、準備環境eclipse
eclipse 默認配置:eclipse.inijvm
-startup plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.300.v20150602-1417 -clean -product org.eclipse.epp.package.jee.product --launcher.defaultAction openFile --launcher.XXMaxPermSize 256M -showsplash org.eclipse.platform --launcher.XXMaxPermSize 256m --launcher.defaultAction openFile --launcher.appendVmargs -vmargs -Dosgi.requiredJavaVersion=1.7 -Xms256m -Xmx1024m
在配置的末尾處添加以下配置文件:工具
-XX:+PrintGCDetails // 輸出GC的詳細日誌 測試
-XX:+PrintGCDateStamps // 輸出GC的時間戳(以日期的形式)優化
-Xloggc:gc.log // 輸出GC的詳細日誌ui
eclipse啓動計時插件:spa
http://www.chendd.cn/information/viewInformation/experienceShare/148.a插件
下載後解壓放置在eclipse或myeclipse的安裝目錄下dropins目錄下便可。
GChisto.jar:gc日誌分析工具jar包一個
直接點擊gchisto.jar就能夠運行,點add載入gc.log
Visual GC: java自帶的內存監控工具,經過visual gc能夠實時的監控到各個內存區域的變化。
Java VisualVM默認沒有安裝Visual GC插件,須要手動安裝,在JDK的安裝目錄的bin目錄下雙擊jvisualvm.exe,便可打開Java VisualVM,在下面的啓動界面中點擊工具->插件->可用插件->Visual GC
安裝完成後重啓Java VisualVM,Visual GC界面自動打開,便可看到JVM中堆內存的分代狀況
3、如何分析GC日誌
摘錄GC日誌一部分(綠色爲年輕代gc回收;藍色爲full gc回收):
2016-07-05T10:43:18.093+0800: 25.395: [GC [PSYoungGen: 274931K->10738K(274944K)] 371093K->147186K(450048K), 0.0668480 secs] [Times: user=0.17 sys=0.08, real=0.07 secs]
2016-07-05T10:43:18.160+0800: 25.462: [Full GC [PSYoungGen: 10738K->0K(274944K)] [ParOldGen: 136447K->140379K(302592K)] 147186K->140379K(577536K) [PSPermGen: 85411K->85376K(171008K)], 0.6763541 secs] [Times: user=1.75 sys=0.02, real=0.68 secs]
經過上面日誌分析得出,PSYoungGen、ParOldGen、PSPermGen屬於Parallel收集器。其中PSYoungGen表示gc回收先後年輕代的內存變化;ParOldGen表示gc回收先後老年代的內存變化;PSPermGen表示gc回收先後永久區的內存變化。young gc 主要是針對年輕代進行內存回收比較頻繁,耗時短;full gc 會對整個堆內存進行回城,耗時長,所以通常儘可能減小full gc的次數。
經過兩張圖很是明顯看出gc日誌構成:
young gc 日誌
Full GC日誌
4、啓動調優
啓動eclipse查看默認配置下啓動時間大概是70秒左右。
根據GChisto分析gc日誌看出來,啓動過程當中進行了45次minor gc,沒有進行full gc;young gc的時間差很少是0.56秒左右。
第一步優化:
爲了不內存頻繁的動態擴展,直接把-Xms配置和-Xmx一致,修改以下:
-Xms1024m
修改完畢,從新啓動:
啓動時間縮小到17秒,分析gc日誌得出young gc10次。
第二步優化:
經過Visual GC看到在eclipse啓動的時候classloader加載class的時間有一些,關閉字節碼可能會優化一部分啓動時間,加入以下參數:
-Xverify:none(關閉Java字節碼驗證,從而加快了類裝入的速度)
從新啓動測試,啓動時間已經優化到了15秒!
至此優化結束,附最終的eclipse.ini文件:
-startup plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.300.v20150602-1417 -clean -product org.eclipse.epp.package.jee.product --launcher.defaultAction openFile --launcher.XXMaxPermSize 256M -showsplash org.eclipse.platform --launcher.XXMaxPermSize 256m --launcher.defaultAction openFile --launcher.appendVmargs -vmargs -Dosgi.requiredJavaVersion=1.7 -Xms1024m -Xmx1024m -Xverify:none -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log