1. 程式人生 > >【jvm實戰】IDEA執行速度調優

【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

3.IDEA執行期間優化

IDEA預設給我們配置了GC收集器是並行的CMS(-XX:+UseConcMarkSweepGC這個引數可以看出),它預設搭配的新生代收集器是ParNew(-XX:+UseParNewGC),由於我個人電腦CPU還是挺強力的,而且開發時也不會開啟太多其他亂七八糟的應用,所以按預設配置就可以了,如果CPU配置比較低,而且CPU佔用率大的使用者,可以考慮改用序列的GC收集器