1. 程式人生 > >JVM 第六篇:極致優化 IDEA 啟動速度

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

![](https://cdn.geekdigging.com/java/java_header.jpg) > 本文內容過於硬核,建議有 Java 相關經驗人士閱讀。 ## 1. 引言 相信做 Java 開發的同學,對 IDEA 這個工具應該都不陌生,即使不使用 IDEA 做開發,那麼對 Eclipse 這個工具應該也不會陌生,如果這兩個都不用的同學,我就想弱弱問一句,您不會是在使用記事本吧? ![](https://cdn.geekdigging.com/java/jvm/jvm4/idea_logo.png) 上面除了那個記事本,我相信所有的同學都對 IDEA 或者說 Eclipse 這兩個工具的開啟速度深有印象吧。 只要你沒自己改過啟動引數,不管電腦多高的配置,我相信這個開啟速度應該都快不到哪去。 前面寫了這麼多篇的 JVM 相關內容,今天我嘗試優化一下 IDEA 的啟動速度(手頭沒有 Eclipse ),這算是小試牛刀,希望最後不要翻車。 ![](https://cdn.geekdigging.com/java/jvm/jvm6/ganga.jpg) ## 2. 開始 我使用的是 JDK 自帶的 VisualVM 視覺化工具,主要使用的是它的那個 GC 外掛。 ![](https://cdn.geekdigging.com/java/jvm/jvm6/VisualVM.png) 首先第一次開啟 IDEA ,載入時長按照 IDEA 所有元件載入完成進行人工卡點(本來想找個外掛的,結果 IDEA 這方面的外掛還真沒找到)。 IDEA 在開啟的過程中,右下角會有一個進度條在一直讀條,我就大約等那個條讀完了進行計時。 後續操作的過程中發現其實完全沒必要,因為差距簡直太明顯了。 首先在預設配置的情況下第一次開啟 IDEA ,然後看下 VisualVM 的資料圖: GC 情況: ![](https://cdn.geekdigging.com/java/jvm/jvm6/GC1.png) 概覽情況: ![](https://cdn.geekdigging.com/java/jvm/jvm6/thread1.png) 我直接被這個 Class Loader 載入速度驚呆了,活活消耗了 3m 34s 的時間,由於其他操作都是並行的,這一項的耗時直接撐破天了。 不過同時可以看到 GC 的消耗,好像並不是很大, Minor GC 發生了 147 次,但是 Full GC 一次都沒有發生過,共計耗時 712ms 。 但是看到下面的概覽圖還是能發現一些端倪的,就比如當前堆大小在一直不停的擴容。 先找到 IDEA 的配置檔案,看下預設配置,我本地的路徑是 `D:\Program Files\JetBrains\apps\IDEA-U\ch-0` ,這個路徑每個人都不一樣,大家自己找自己的,找到以後開啟 `idea64.exe.vmoptions` 這個檔案: ```java -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 再重啟看下效果。 修改後的配置如下: ```java -Xms1g -Xmx2g -XX:ReservedCodeCacheSize=240m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 ``` GC 情況: ![](https://cdn.geekdigging.com/java/jvm/jvm6/GC2.png) 概覽情況: ![](https://cdn.geekdigging.com/java/jvm/jvm6/thread2.png) 可以看到,Class Loader 時長瞬間就下來了,從 3m 變成了 24s ,並且 Minor GC 的時長整整縮短了一半,從 712ms 下降到了 342ms ,次數也由之前的 147 次下降到了現在的 9 次,依然沒有 Full GC 產生(廢話,記憶體開了這麼大又填不滿)。 並且看概覽圖的時候可以看到,堆記憶體擴容只擴容了一次。 那麼還能不能再短點呢?看下整個圖,感覺 ClassLoader 還有空間嘛,我們還可以把載入時的驗證給關掉,使用 `-Xverify:none` ,這樣應該還能再降低一些載入的耗時。 修改後的配置如下: ```java -Xms1g -Xmx2g -XX:ReservedCodeCacheSize=240m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -Xverify:none ``` GC 情況: ![](https://cdn.geekdigging.com/java/jvm/jvm6/GC3.png) 概覽情況: ![](https://cdn.geekdigging.com/java/jvm/jvm6/thread3.png) 果然,載入時長從之前的 24s 繼續下降到了 19s ,差不多減少了有 1/4 左右,還是卓有成效的。 接著我想如果直接把最小堆也設定成 2G ,那麼堆大小就無需擴容,會不會有更加正向的影響? 修改後的配置如下: ```java -Xms2g -Xmx2g -XX:ReservedCodeCacheSize=240m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -Xverify:none ``` GC 情況: ![](https://cdn.geekdigging.com/java/jvm/jvm6/GC4.png) 概覽情況: ![](https://cdn.geekdigging.com/java/jvm/jvm6/thread4.png) 實際上並沒有什麼太大成效。 從概覽中可以看到,我當前版本的 IDEA 使用的是自帶的 JDK11 : ![](https://cdn.geekdigging.com/java/jvm/jvm6/idea_jvm_gailan.png) JDK11 中是有 G1 收集器的,我要麼開啟 G1 試一下: ```java -Xms1g -Xmx2g -XX:ReservedCodeCacheSize=240m -XX:+UseG1GC -XX:SoftRefLRUPolicyMSPerMB=50 -Xverify:none ``` GC 情況: ![](https://cdn.geekdigging.com/java/jvm/jvm6/GC5.png) 概覽情況: ![](https://cdn.geekdigging.com/java/jvm/jvm6/thread5.png) 看起來好像 Minor GC 的耗時還略有上漲,並且 GC 的次數從 9 次變成了 19 次。 不過看到概覽圖發現了一個更神奇的事情,當使用 G1 的時候,整個使用堆大小竟然沒有突破 1G ,看來電腦記憶體不夠大的同學更加推薦使用 G1 回收器,雖然 GC 的耗時稍有增加,不過能減少記憶體的使用,而 G1 的 GC 機制又是大量並行的,這點根本無傷大雅。 最後我放一下我修改後的整體的配置: ```java -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 修改了一下配置,啟動速度絕對大幅提升,肉眼可見的那種。