本文作者在和同事的一次討論中發現,對 IntelliJ IDEA 記憶體采用不同的設定方案,會對 IDE 的速度和回應能力產生不同的影響,

Don’t be a Scrooge and give your IDE some more memory
不要做守財奴,給IDE多留點記憶體吧,
昨天,大家就是否自定義 IntelliJ IDEA 的記憶體設定進行了討論,有些人選擇默認設定,有些人會對默認的設定進行簡單的變更,還有一些開發者會基于他們的需求進行全面復雜的設定,筆者目前的作業是處理幾個微服務專案和一個老專案,而客戶的核心業務需求非常大,對 IntelliJ IDEA 記憶體進行簡單設定以后,筆者明顯感受到了該 IDE 在速度和回應方面的改善,但當時筆者并未進行具體的測量,所以這只是主觀感受而已,
不過,參與討論的一位開發者給筆者發了一份他的設定,雖然是針對同個專案,該設定卻極其復雜,筆者對自己的設定并無不滿,但非常好奇,這些完全不同的設定對比 JetBrains 提供的默認設定,會有怎樣的不同,
目標
筆者的計劃是,在一個接近日常開發專案的場景下(加載一個大專案、加載2、3個微服務、git pull 后重繪大專案),測驗各個設定帶來的效果,并選出記憶體消耗和速度都達到最優時的最佳設定,
測驗機器和專案
筆記本電腦:MacBook Pro Retina, 2.3GHz Intel Core i7, 16GB 1600Mhz DDR3,SSD Disc, OS X Yosemite
專案
- 大專案—— Monolith ,70萬行代碼( Java 8 和 Groovy ),303個Gradle模塊
- 兩個微服務——約有10000——20000行代碼( Java 8 和 Groovy )的小專案,各有一個Gradle模塊
測驗場景
- 在 Idea 中關閉所有專案
- 基于測驗檔案 idea.vmoptions 進行設定
- 重啟電腦
- 啟動后關閉所有不相關的專案( communicators 等等)
- 打開 Idea(測驗時間)
- 打開大專案(測驗時間)
- 檢查 jstat -gcutil
- 打開兩個微服務專案(測驗時間)
- 檢查 jstat -gcutil
- 回傳大專案然后點擊“重繪 Gradle 專案”按鈕(測驗時間)
- 檢查 jstat -gcutil
jstat -gcutil
jstat 是 JDK 自帶的工具,主要利用 JVM 內建的指令對 Java 應用程式的資源和性能進行實時的命令列監控,還包括對 Heap size 和垃圾回收狀況的監控,它有許多選項來收集各種資料(完整的檔案),但這里只會用到:-gcutil :
-gcutil - Summary of garbage collection statistics.
S0: Survivor space 0 utilization as a percentage of the space's current capacity.
S1: Survivor space 1 utilization as a percentage of the space's current capacity.
E: Eden space utilization as a percentage of the space's current capacity.
O: Old space utilization as a percentage of the space's current capacity.
M: Metaspace utilization as a percentage of the space's current capacity.
CCS: Compressed class space utilization as a percentage.
YGC: Number of young generation GC events.
YGCT: Young generation garbage collection time.
FGC: Number of full GC events.
FGCT: Full garbage collection time.
GCT: Total garbage collection time.
這個命令的輸出結果如下:
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
89.70 0.00 81.26 74.27 95.68 91.76 40 2.444 14 0.715 3.159
在本文中,最重要的引數是 GC 事件( YGC 和 FGC )次數和收集時間( YGCT 和 FGCT ),
測驗設定
筆者設定了四種不同的設定,為了好記,給它們起了不同的名字,
默認(灰色標識)
JetBrains 提供的默認設定:
-Xms128m
-Xmx750m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=240m
-XX:+UseCompressedOops
Big(大)(紅色標識)
給 Xmx 配 4096MB, ReservedCodeCacheSize 設定 1024MB,這已經是相當多的記憶體了:
-Xms1024m
-Xmx4096m
-XX:ReservedCodeCacheSize=1024m
-XX:+UseCompressedOops
Balanced(平衡的)(藍色標識)
Xmx 和 Xms 都分配 2GB ,這是相當平衡的記憶體消耗:
-Xms2g
-Xmx2g
-XX:ReservedCodeCacheSize=1024m
-XX:+UseCompressedOops
Sophisticated(復雜的)(橘色標識)
和上面一樣, Xmx 和 Xms 都分配2GB,但是給 GC 和記憶體管理指定不同的垃圾回收器和許多不同的標志:
-server
-Xms2g
-Xmx2g
-XX:NewRatio=3
-Xss16m
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:ConcGCThreads=4
-XX:ReservedCodeCacheSize=240m
-XX:+AlwaysPreTouch
-XX:+TieredCompilation
-XX:+UseCompressedOops
-XX:SoftRefLRUPolicyMSPerMB=50
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djsse.enableSNIExtension=false
-ea
以上便是筆者的測驗設定,為了執行該測驗用例,還需要在~/Library/Preferences/IntelliJIdea15/下創建一個idea.vmoptions檔案(這是 Mac OS 系統下的路徑設定,查看這篇文章,基于你的作業系統進行設定)
現在,執行測驗用例并比較結果,
結果
Idea啟動時間

正如上圖所示,啟動時間并不依賴于記憶體設定,Idea 在所有場景下的測驗時間都是10秒,無論記憶體分配有多少,這并不足為奇,因為在此早期階段,這些設定并不會影響到應用的行為,
加載大專案花費的時間
現在加載 Monolith 專案及其70萬行代碼,終于,出現了一些的差異,默認設定所花費的時間幾乎是其它的3倍,很明顯,如此龐大的代碼庫需要更多的記憶體,如果我們執行:
jstat -gcutil <IDEA_PID>
會發現,對比其它設定, GC 在默認設定下會變得例外忙碌,


不僅 GC 釋放記憶體的總時間非常高(幾乎達到了50倍),而且 Full GC 的平均執行時間也非常非常長,大量的時間都花在了 Full GC 上面,這是 IDE 回應速度低的主要原因,
在IDEA中打開兩個微服務
現在加載這兩個微服務專案,在 IDEA 中打開并且對比他們所消耗的時間,

在這個測驗用例下,差異還是非常明顯的,復雜設定表現最佳,而默認設定仍舊輸給了其他兩種設定,
再次使用jstat –gcutil
加載完兩個微服務專案后,來檢查一下同時打開3個專案的情況下, GC 的表現情況,經測驗發現,3個不同的自定義設定表現幾乎差不多,而默認設定簡直弱爆了,


最后的角逐:重新加載Monolith
現在,筆者需要從倉庫中獲得 Monolith 專案的最新版本,并且重繪 Gradle 模塊,這樣, IDEA 能看到所有的新類,

重要提示:代表默認設定的灰色條形柱非常高,因為 IDEA 在重繪程序中崩潰了,筆者無法測量實際時間,顯然,默認分配的記憶體不足以執行該操作,
但從三個自定義例子中可以發現,大記憶體配置花費的時間是最短的,所以,記憶體分配還是起到了作用,
最后一次使用jstat-gcutil
因為 IDEA 在默認設定下無法重繪專案,所以,這次測驗默認設定就不包括在里面,


從上圖可以看出,三者之間的差異不大,但是 Big 配置下的 Full GC 執行時間最快,此外, Xmx 記憶體大些對回應能力提升的幫助非常明顯,
總結
在這次簡短的實驗中,大家可以發現,即使對 IntelliJ IDEA 記憶體進行微調,都可以大大提升 IDE 性能,當然,記憶體分配越多,執行效果就越好,但是,你也會發現, IDE 之外許多其他應用程式也需要消耗記憶體,所以,大家的目標應該是在提高性能和記憶體消耗之間找到一個平衡,筆者認為,在大多數情況下,把 Xmx 值設定在 2G 和 3G 之間是最佳的,如果你有更多的時間可以用 jstat 和 jvisualm 檢查用不同的 JVM 設定如何影響性能和記憶體占用,
討論
你的 idea.vmoptions 是如何配置的呢?你還有其它提高 InteliJ IDEA 性能的方法嗎?不妨一起討論討論吧,看文容易寫文難,關注公眾號:程式零世界,查看更多趣味干貨文章,領取java學習資料
(編譯自:https://dzone.com/articles/the-one-and-only-reason-to-customize-intellij-idea
作者:OneAPM
)

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/157902.html
標籤:Java
上一篇:springcloud vue.js 微服務分布式 flowable 作業流 前后分離 集成代碼生成器 shiro權限
