IntelliJ IDEA 卡成球了?
在和同事的一次討論中發(fā)現(xiàn),對(duì) IntelliJ IDEA 內(nèi)存采用不同的設(shè)置方案,會(huì)對(duì) IDE 的速度和響應(yīng)能力產(chǎn)生不同的影響。

不要做守財(cái)奴,給IDE多留點(diǎn)內(nèi)存吧。
目標(biāo)
測(cè)試機(jī)器和項(xiàng)目
項(xiàng)目
兩個(gè)微服務(wù)——約有10000——20000行代碼( Java 8 和 Groovy )的小項(xiàng)目,各有一個(gè)Gradle模塊
測(cè)試場(chǎng)景
在 Idea 中關(guān)閉所有項(xiàng)目 基于測(cè)試文件 idea.vmoptions 進(jìn)行設(shè)置 重啟電腦 啟動(dòng)后關(guān)閉所有不相關(guān)的項(xiàng)目( communicators 等等) 打開 Idea(測(cè)試時(shí)間) 打開大項(xiàng)目(測(cè)試時(shí)間) 檢查 jstat -gcutil 打開兩個(gè)微服務(wù)項(xiàng)目(測(cè)試時(shí)間) 檢查 jstat -gcutil 返回大項(xiàng)目然后點(diǎn)擊“刷新 Gradle 項(xiàng)目”按鈕(測(cè)試時(shí)間) 檢查 jstat -gcutil
jstat -gcutil
jstat 是 JDK 自帶的工具,主要利用 JVM 內(nèi)建的指令對(duì) Java 應(yīng)用程序的資源和性能進(jìn)行實(shí)時(shí)的命令行監(jiān)控,還包括對(duì) Heap size 和垃圾回收狀況的監(jiān)控。它有許多選項(xiàng)來收集各種數(shù)據(jù),但這里只會(huì)用到:
-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
測(cè)試設(shè)置
筆者設(shè)置了四種不同的設(shè)置,為了好記,給它們起了不同的名字。
默認(rèn)(灰色標(biāo)識(shí))
JetBrains 提供的默認(rèn)設(shè)置:
-Xms128m
-Xmx750m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=240m
-XX:+UseCompressedOops
Big(大)(紅色標(biāo)識(shí))
給 Xmx 配 4096MB, ReservedCodeCacheSize 設(shè)置 1024MB,這已經(jīng)是相當(dāng)多的內(nèi)存了:
-Xms1024m-Xmx4096m-XX:ReservedCodeCacheSize=1024m-XX:+UseCompressedOops
Balanced(平衡的)(藍(lán)色標(biāo)識(shí))
Xmx 和 Xms 都分配 2GB ,這是相當(dāng)平衡的內(nèi)存消耗:
-Xms2g
-Xmx2g
-XX:ReservedCodeCacheSize=1024m
-XX:+UseCompressedOops
Sophisticated(復(fù)雜的)(橘色標(biāo)識(shí))
和上面一樣, Xmx 和 Xms 都分配2GB,但是給 GC 和內(nèi)存管理指定不同的垃圾回收器和許多不同的標(biāo)志:
-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
以上便是筆者的測(cè)試設(shè)置,為了執(zhí)行該測(cè)試用例,還需要在~/Library/Preferences/IntelliJIdea15/下創(chuàng)建一個(gè)idea.vmoptions文件(這是 Mac OS 系統(tǒng)下的路徑設(shè)置,基于你的操作系統(tǒng)進(jìn)行設(shè)置)
現(xiàn)在,執(zhí)行測(cè)試用例并比較結(jié)果。
結(jié)果
Idea啟動(dòng)時(shí)間

加載大項(xiàng)目花費(fèi)的時(shí)間
現(xiàn)在加載 Monolith 項(xiàng)目及其70萬行代碼。終于,出現(xiàn)了一些的差異。默認(rèn)設(shè)置所花費(fèi)的時(shí)間幾乎是其它的3倍。很明顯,如此龐大的代碼庫需要更多的內(nèi)存。如果我們執(zhí)行:
jstat -gcutil <IDEA_PID>


在IDEA中打開兩個(gè)微服務(wù)

再次使用jstat –gcutil
加載完兩個(gè)微服務(wù)項(xiàng)目后,來檢查一下同時(shí)打開3個(gè)項(xiàng)目的情況下, GC 的表現(xiàn)情況。經(jīng)測(cè)試發(fā)現(xiàn),3個(gè)不同的自定義設(shè)置表現(xiàn)幾乎差不多,而默認(rèn)設(shè)置簡(jiǎn)直弱爆了。


最后的角逐:重新加載Monolith

最后一次使用jstat-gcutil


總結(jié)
1、2019 年 9 月全國程序員工資統(tǒng)計(jì),你是什么水平?
3、從零開始搭建創(chuàng)業(yè)公司后臺(tái)技術(shù)棧
5、37歲程序員被裁,120天沒找到工作,無奈去小公司,結(jié)果懵了...
6、滴滴業(yè)務(wù)中臺(tái)構(gòu)建實(shí)踐,首次曝光
