1. 程式人生 > >JVM---vm調優的例項1

JVM---vm調優的例項1

最近,Eclipse(Eclipse-JEE3.5)執行十分緩慢(可能外掛安裝過多),因此,得到了個機會調優一下,以便提高工作效率 下圖是未經任何調整eclipse的gc情況(使用jvisualvm命令,安裝visual gc外掛)

在終端輸入:jvisualvm執行後,工具->外掛->visual gc,安裝。

啟動eclipse後,在終端執行: ps -ef | grep eclipse,然後在jvisualvm的應用程式一欄選擇eclipse pid的程式雙擊,即可到visual gc上檢視圖表。

-Xms1024m -Xmx1024m

對應的為圖中的 Old 區;

-XX:NewSize=768m -XX:MaxNewSize=768m

對應的為圖中的 Eden 區;

-XX:PermSize=200m -XX:MaxPermSize=200m

對應的為圖中的 Perm區; 從圖中可以看出,僅啟動過程就有38次young gc,11次full gc 為了檢視gc細節,在eclipse.ini中加入如下引數: -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:D:/soft/eclipse-jee/gc.log gc的內容如下: 從gc日誌中可以看出: (1)young區開始為4928K,持續的不夠,因此造成不斷的young gc (2)full gc時,old區的空間增大擴容,因此old區空間也不夠 為了防止這種情況發生,加入以下引數: -Xms768m -Xmx768m -XX:NewSize=512m -XX:MaxNewSize=512m 此次調整後結果如下圖:

從圖中可以看出,young gc沒有了,但為啥還11次full gc呢? 以下是此次gc的日誌: 從gc.log中,可以看出,是因為perm區的沒有空間了,才導致的full gc,於是將perm區增大並固定大小 加入以下引數: -XX:PermSize=96m -XX:MaxPermSize=96m 此次調整後結果如下: 可以看出,沒有full gc了,而且young gc只有一次,有了一定的效果了 啟動時gc的問題解決了,現在來看其他問題: 從圖中可以看出,如果classloader載入class的時間能快些,應該也會節省些時間 加入以下引數: -Xverify:none(關閉Java位元組碼驗證,從而加快了類裝入的速度)
將上兩圖比較 第一個:平均每個類的載入時間為,54.615/10950 = 0.0049876712328767s 第二個:平均每個類的載入時間為,34.498/9484 = 0.0036374947279629s 可以看出,多少是有一些效能上的提高的 考慮到eclipse長時間執行,其他可能調節的有以下幾點: (1)關閉System.gc() (2)提高eclipse中某些程式碼的JIT編譯 (3)優化垃圾收集器,以減少垃圾收集造成應用無響應的時間 對於(1),加入以下引數: -XX:+DisableExplicitGC 對於(2),會影響啟動速度,但由於eclipse是長時間執行,因此此優化是必要的: -XX:CompileThreshold=100(方法呼叫多少次就會被編譯成本地機器碼) 可以看出,編譯方法的數量和時間明顯增加 對於(3),換用CMS收集器應該比序列收集器要好,加入以下引數: -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 至此,調優結束

總結一下加入的引數如下: -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:D:/soft/eclipse-jee-galileo-win32/eclipse/gc.log-Xms512m -Xmx512m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=96m -XX:MaxPermSize=96m -XX:+DisableExplicitGC -XX:CompileThreshold=100 -Xverify:none -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80

參考如上內容用的eclipse.ini:

1、小記憶體,執行情況不錯

-clean -startup plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar --launcher.library plugins/org.eclipse.equinox.launcher.gtk.linux.x86_1.1.200.v20130807-1835 -product org.eclipse.epp.package.cpp.product --launcher.defaultAction openFile -showsplash org.eclipse.platform --launcher.XXMaxPermSize 256m --launcher.defaultAction openFile --launcher.appendVmargs -vmargs -Dosgi.requiredJavaVersion=1.6 -Xms512m -Xmx512m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=96m -XX:MaxPermSize=96m -XX:+DisableExplicitGC -XX:CompileThreshold=100 -Xverify:none -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80

2、大記憶體

-clean -startup plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar --launcher.library plugins/org.eclipse.equinox.launcher.gtk.linux.x86_1.1.200.v20130807-1835 -product org.eclipse.epp.package.cpp.product --launcher.defaultAction openFile -showsplash org.eclipse.platform --launcher.XXMaxPermSize 256m --launcher.defaultAction openFile --launcher.appendVmargs -vmargs -Dosgi.requiredJavaVersion=1.6 -Xms1600m -Xmx1600m -XX:NewSize=800m -XX:MaxNewSize=800m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC -XX:CompileThreshold=100 -Xverify:none -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80

3、大記憶體,自己弄的,可能優化的不合理

-clean -startup plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar --launcher.library plugins/org.eclipse.equinox.launcher.gtk.linux.x86_1.1.200.v20130807-1835 -product org.eclipse.epp.package.cpp.product --launcher.defaultAction openFile -showsplash org.eclipse.platform --launcher.XXMaxPermSize 256m --launcher.defaultAction openFile --launcher.appendVmargs -vmargs -Dosgi.requiredJavaVersion=1.6 -XX:MaxPermSize=256m -Xms40m -Xmx2048m -Xss1024k -Xss1024k -XX:+DisableExplicitGC -XX:CompileThreshold=100 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -Xverify:none