JVM 第六篇:極致優化 IDEA 啟動速度
阿新 • • 發佈:2020-10-15
![](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 修改了一下配置,啟動速度絕對大幅提升,肉眼可見的那種。