JVM 第六篇:極致優化 IDEA 啓動速度

本文內容過於硬核,建議有 Java 相關經驗人士閱讀。

1. 引言

相信做 Java 開發的同學,對 IDEA 這個工具應該都不陌生,即使不使用 IDEA 做開發,那麼對 Eclipse 這個工具應該也不會陌生,如果這兩個都不用的同學,我就想弱弱問一句,您不會是在使用記事本吧?

上面除了那個記事本,我相信所有的同學都對 IDEA 或者說 Eclipse 這兩個工具的打開速度深有印象吧。

只要你沒自己改過啓動參數,不管電腦多高的配置,我相信這個打開速度應該都快不到哪去。

前面寫了這麼多篇的 JVM 相關內容,今天我嘗試優化一下 IDEA 的啓動速度(手頭沒有 Eclipse ),這算是小試牛刀,希望最後不要翻車。

2. 開始

我使用的是 JDK 自帶的 VisualVM 可視化工具,主要使用的是它的那個 GC 插件。

首先第一次打開 IDEA ,加載時長按照 IDEA 所有組件加載完成進行人工卡點(本來想找個插件的,結果 IDEA 這方面的插件還真沒找到)。

IDEA 在打開的過程中,右下角會有一個進度條在一直讀條,我就大約等那個條讀完了進行計時。

後續操作的過程中發現其實完全沒必要,因爲差距簡直太明顯了。

首先在默認配置的情況下第一次打開 IDEA ,然後看下 VisualVM 的數據圖:

GC 情況:

概覽情況:

我直接被這個 Class Loader 加載速度驚呆了,活活消耗了 3m 34s 的時間,由於其他操作都是並行的,這一項的耗時直接撐破天了。

不過同時可以看到 GC 的消耗,好像並不是很大, Minor GC 發生了 147 次,但是 Full GC 一次都沒有發生過,共計耗時 712ms 。

但是看到下面的概覽圖還是能發現一些端倪的,就比如當前堆大小在一直不停的擴容。

先找到 IDEA 的配置文件,看下默認配置,我本地的路徑是 D:\Program Files\JetBrains\apps\IDEA-U\ch-0 ,這個路徑每個人都不一樣,大家自己找自己的,找到以後打開 idea64.exe.vmoptions 這個文件:

-Xms128m
-Xmx750m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-XX:CICompilerCount=2
-Dsun.io.useCanonPrefixCache=false
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Djdk.attach.allowAttachSelf=true
-Dkotlinx.coroutines.debug=off
-Djdk.module.illegalAccess.silent=true

可以看到最小堆是設置 128MB ,而最大堆是 750MB ,使用的是 CMS 收集器,我使用的電腦硬件內存是 16GB ,這麼大的內存空間,果斷直接把最小堆改成 1G ,最大堆改成 2G ,關掉 IDEA 再重啓看下效果。

修改後的配置如下:

-Xms1g
-Xmx2g
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50

GC 情況:

概覽情況:

可以看到,Class Loader 時長瞬間就下來了,從 3m 變成了 24s ,並且 Minor GC 的時長整整縮短了一半,從 712ms 下降到了 342ms ,次數也由之前的 147 次下降到了現在的 9 次,依然沒有 Full GC 產生(廢話,內存開了這麼大又填不滿)。

並且看概覽圖的時候可以看到,堆內存擴容只擴容了一次。

那麼還能不能再短點呢?看下整個圖,感覺 ClassLoader 還有空間嘛,我們還可以把加載時的驗證給關掉,使用 -Xverify:none ,這樣應該還能再降低一些加載的耗時。

修改後的配置如下:

-Xms1g
-Xmx2g
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-Xverify:none

GC 情況:

概覽情況:

果然,加載時長從之前的 24s 繼續下降到了 19s ,差不多減少了有 1/4 左右,還是卓有成效的。

接着我想如果直接把最小堆也設置成 2G ,那麼堆大小就無需擴容,會不會有更加正向的影響?

修改後的配置如下:

-Xms2g
-Xmx2g
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-Xverify:none

GC 情況:

概覽情況:

實際上並沒有什麼太大成效。

從概覽中可以看到,我當前版本的 IDEA 使用的是自帶的 JDK11 :

JDK11 中是有 G1 收集器的,我要麼開啓 G1 試一下:

-Xms1g
-Xmx2g
-XX:ReservedCodeCacheSize=240m
-XX:+UseG1GC
-XX:SoftRefLRUPolicyMSPerMB=50
-Xverify:none

GC 情況:

概覽情況:

看起來好像 Minor GC 的耗時還略有上漲,並且 GC 的次數從 9 次變成了 19 次。

不過看到概覽圖發現了一個更神奇的事情,當使用 G1 的時候,整個使用堆大小竟然沒有突破 1G ,看來電腦內存不夠大的同學更加推薦使用 G1 回收器,雖然 GC 的耗時稍有增加,不過能減少內存的使用,而 G1 的 GC 機制又是大量並行的,這點根本無傷大雅。

最後我放一下我修改後的整體的配置:

-Xms1g
-Xmx2g
-XX:ReservedCodeCacheSize=240m
-XX:+UseG1GC
-XX:SoftRefLRUPolicyMSPerMB=50
-Xverify:none
-ea
-XX:CICompilerCount=2
-Dsun.io.useCanonPrefixCache=false
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Dkotlinx.coroutines.debug=off
-Djdk.module.illegalAccess.silent=true
-Dide.no.platform.update=true
-Djdk.attach.allowAttachSelf=true
-Didea.plugins.path=D:\\Program Files\\JetBrains\\apps\\IDEA-U\\ch-0\\202.7660.26.plugins

當然,如果不用 IDEA 的同學,只要是用 Jetbrain 全家桶套件,例如寫 Python 最常用的 Pycharm ,同樣也可以按照本文的方式進行配置,我自己又給 Pycharm 修改了一下配置,啓動速度絕對大幅提升,肉眼可見的那種。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章