【jvm實戰】IDEA執行速度調優
1.個人電腦配置
CPU:Intel Core i7-7700HQ 2.80GHz RAM:16.0G OS:windows10 64位2.IDEA啟動速度優化
開啟ides安裝目錄裡的bin資料夾,開啟idea.exe.vmoptions(64位的叫idea64.exe.vmoptions)看到的是idea安裝完成後預設的VM引數配置(其實裡面還有一些其他的配置,最好不要動它們):
-Xms128m
-Xmx512m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
這個配置下,idea的啟動時間大概是20s,下面是啟動完成時VisualVM裡的截圖:
可以看到:發生Minor GC 103次,共719.084ms,Major GC 14次,共442.858ms,個人覺得預設配置下已經執行的比較流暢了。
順便提一下,可用以下命令來輸出一個名為gclog.log的gc日誌來檢視各種GC的詳細資訊
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-Xloggc:gclog.log
繼續,我們可以嘗試一下把堆記憶體降低一下:
-Xms128m
-Xmx256m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
這次idea的啟動時間大概是21s,啟動完成時VisualVM裡的截圖:
可以看到執行Major GC 41次,一共3.4秒,這就是老年代記憶體不足導致頻繁執行FULL GC的結果.
最後看看我調大堆記憶體的執行結果,配置如下:
-Xms1024m
-Xmx2048m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
啟動時間19s,結果:
這次的執行結果是最理想的Minor GC和Major GC的次數都降下來了.
老年代擴容的時候也會導致FULL GC,我把最小堆調到與最大堆一樣,另外idea執行時可能會時不時執行一下System,gc()來進行FULL GC,通過-XX:+DisableExplicitGC來禁止此操作。最後我發現無論堆記憶體設成多大,FULL GC還是會有那麼幾次,個人猜測是metaspace區(JDK1.8之前是perm區)記憶體不夠進行擴容時導致的,於是把metaspace的初始值調成512m:
-Xms2048m
-Xmx2048m
-XX:+DisableExplicitGC
-XX:MetaspaceSize=512m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
執行結果啟動用了18.8s
可以看到Full GC的次數在啟動完成時是0了
繼續優化,IDEA使用者較多,它的編譯程式碼我們可以認為是可靠的,不需要在載入的時候再進行位元組碼驗證,用-Xverify:none引數可以禁止掉位元組碼驗證:
-Xms2048m
-Xmx2048m
-Xverify:none
-XX:+DisableExplicitGC
-XX:MetaspaceSize=512m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
執行結果啟動用了17.6s
修改前的類載入時間為38.41s修改後為31.70s