在和同事的一次討論中發(fā)現(xiàn),對 IntelliJ IDEA 內(nèi)存采用不同的設(shè)置方案,會對 IDE 的速度和響應(yīng)能力產(chǎn)生不同的影響。Don’t be a Scrooge and give your IDE some more memory不要做守財奴,給IDE多留點內(nèi)存吧。 昨天,大家就是否自定義IntelliJ IDEA 的內(nèi)存設(shè)置進行了討論,有些人選擇默認設(shè)置,有些人會對默認的設(shè)置進行簡單的變更,還有一些開發(fā)者會基于他們的需求進行全面復(fù)雜的設(shè)置。筆者目前的工作是處理幾個微服務(wù)項目和一個老項目,而客戶的核心業(yè)務(wù)需求非常大。對 IntelliJ IDEA 內(nèi)存進行簡單設(shè)置以后,筆者明顯感受到了該 IDE 在速度和響應(yīng)方面的改善。但當時筆者并未進行具體的測量,所以這只是主觀感受而已。 不過,參與討論的一位開發(fā)者給筆者發(fā)了一份他的設(shè)置,雖然是針對同個項目,該設(shè)置卻極其復(fù)雜。筆者對自己的設(shè)置并無不滿,但非常好奇,這些完全不同的設(shè)置對比 JetBrains 提供的默認設(shè)置,會有怎樣的不同。關(guān)注微信公眾號果汁簡歷,回復(fù) IDEA 就可以免費獲取注冊碼
筆記本電腦:MacBook Pro Retina, 2.3GHz Intel Core i7, 16GB 1600Mhz DDR3,SSD Disc, OS X Yosemite項目大項目—— Monolith ,70萬行代碼( Java[1] 8 和 Groovy ),303個Gradle模塊兩個微服務(wù)——約有10000——20000行代碼( Java 8 和 Groovy )的小項目,各有一個Gradle模塊
測試場景
在 Idea 中關(guān)閉所有項目
基于測試文件 idea.vmoptions 進行設(shè)置
重啟電腦
啟動后關(guān)閉所有不相關(guān)的項目( communicators 等等)
打開 Idea(測試時間)
打開大項目(測試時間)
檢查 jstat -gcutil
打開兩個微服務(wù)項目(測試時間)
檢查 jstat -gcutil
返回大項目然后點擊“刷新 Gradle 項目”按鈕(測試時間)
檢查 jstat -gcutil
jstat -gcutil
jstat 是 JDK 自帶的工具,主要利用 JVM 內(nèi)建的指令對 Java 應(yīng)用程序的資源和性能進行實時的命令行監(jiān)控,還包括對 Heap size 和垃圾回收狀況的監(jiān)控。它有許多選項來收集各種數(shù)據(jù),但這里只會用到: -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.這個命令的輸出結(jié)果如下:S0S1EOMCCSYGCYGCTFGCFGCTGCT 89.70 0.00 81.26 74.27 95.68 91.76 40 2.444 14 0.715 3.159在本文中,最重要的參數(shù)是 GC 事件( YGC 和 FGC )次數(shù)和收集時間( YGCT 和 FGCT )。測試設(shè)置筆者設(shè)置了四種不同的設(shè)置,為了好記,給它們起了不同的名字。
現(xiàn)在,筆者需要從倉庫中獲得 Monolith 項目的最新版本,并且刷新 Gradle 模塊,這樣, IDEA 能看到所有的新類。重要提示:代表默認設(shè)置的灰色條形柱非常高,因為 IDEA 在刷新過程中崩潰了,筆者無法測量實際時間。顯然,默認分配的內(nèi)存不足以執(zhí)行該操作。 但從三個自定義例子中可以發(fā)現(xiàn),大內(nèi)存配置花費的時間是最短的。所以,內(nèi)存分配還是起到了作用。
最后一次使用jstat-gcutil
因為 IDEA 在默認設(shè)置下無法刷新項目,所以,這次測試默認設(shè)置就不包括在里面。從上圖可以看出,三者之間的差異不大,但是 Big 配置下的 Full GC 執(zhí)行時間最快。此外, Xmx 內(nèi)存大些對響應(yīng)能力提升的幫助非常明顯。
總結(jié)
在這次簡短的實驗中,大家可以發(fā)現(xiàn),即使對 IntelliJ IDEA 內(nèi)存進行微調(diào),都可以大大提升 IDE 性能。當然,內(nèi)存分配越多,執(zhí)行效果就越好。但是,你也會發(fā)現(xiàn), IDE 之外許多其他應(yīng)用程序也需要消耗內(nèi)存,所以,大家的目標應(yīng)該是在提高性能和內(nèi)存消耗之間找到一個平衡。筆者認為,在大多數(shù)情況下,把 Xmx 值設(shè)置在 2G 和 3G 之間是最佳的。如果你有更多的時間可以用 jstat 和 jvisualm 檢查用不同的 JVM 設(shè)置如何影響性能和內(nèi)存占用。翻譯:https://dzone.com/articles/the-one-and-only-reason-to-customize-intellij-idea