古人說得好,工欲善其事救巷,必先利其器,這篇小隨筆其實很久之前就該寫了(因為是很久之前做的事情了)【淠現(xiàn)在為了寫它浦译,還得手動復現(xiàn)當時的場景,真麻煩吶俄占。
筆者的機器配置和環(huán)境如下:
- Intel Core i7-4870HQ, 4C/8T @ 2.5~3.7GHz
- 16GB DDR3L 1600MHz RAM
- 512GB PCIe SSD
- macOS Mojave 10.14.4
- IntelliJ IDEA 2018.2.7
調整IDEA的JVM參數(shù)還是很有必要的管怠,下面是我從打開IDEA到一頓操作使之內存吃緊之后的內存占用及GC情況:
當開的項目過多,或Build/Import超大項目時缸榄,就會出現(xiàn)這種提示(在1080p外接顯示器上截的渤弛,糊了),并且會越發(fā)卡頓:
點擊Configure甚带,就會彈出修改最大堆大小的對話框:
當然她肯,我們并不滿足于只修改堆大小。點擊IDEA Help菜單中的Edit Custom VM Options項鹰贵,打開IDEA的JVM參數(shù)列表晴氨,就可以進行優(yōu)化了。
請注意碉输,以下是根據我的環(huán)境調整的參數(shù)籽前,雖然大體通用,但仍然要具體情況具體分析敷钾。另外為了表述清晰枝哄,寫了一些注釋,有一些默認開啟的項也加了進來阻荒,就當是復習+拓展一下常用的JVM參數(shù)吧挠锥。
# 堆大小,按常規(guī)操作侨赡,設成相同的蓖租,避免自動擴容
-Xms1536m
-Xmx1536m
# 年輕代大小粱侣,Sun推薦設置為堆大小的3/8
-Xmn576m
# 在JVM啟動時即預初始化堆中的所有頁,能夠快速利用
-XX:+AlwaysPreTouch
# 設置一個較大的元空間初始值蓖宦,避免頻繁GC擴容
-XX:MetaspaceSize=256m
# 元空間最大默認不限制齐婴,設一個值保護一下
-XX:MaxMetaspaceSize=768m
# 啟用CMS GC
-XX:+UseConcMarkSweepGC
# 啟用年輕代并行GC,與CMS是好搭檔球昨,其實也不用另寫
-XX:+UseParNewGC
# CMS并行標記尔店,降低標記階段停頓時間
-XX:+CMSParallelRemarkEnabled
# 觸發(fā)CMS GC的堆內存占用比例,調大點以降低GC頻率
-XX:CMSInitiatingOccupencyFraction=85
# GC線程數(shù)(ParallelGCThreads主慰、ConcGCThreads)用默認值嚣州,不再寫
# 對象晉升到老年代的年齡,默認15共螺。根據觀察该肴,對IDEA來說設成10就足夠了
-XX:MaxTenuringThreshold=10
# 壓縮普通對象指針
-XX:+UseCompressedOops
# 指定服務器版JIT編譯器,其實不用寫藐不,默認已經是了
-server
# JIT代碼緩存的大小匀哄,默認是240M
-XX:ReservedCodeCacheSize=360M
# 打開JIT分層編譯,默認是開啟的了
-XX:+TieredCompilation
# 每MB堆空間中的軟引用能夠存活的近似毫秒數(shù)
-XX:SoftRefLRUPolicyMSPerMB=50
# OOM時輸出堆dump轉儲文件
-XX:+HeapDumpOnOutOfMemoryError
# 禁止把某些異常的stack trace優(yōu)化掉雏蛮,防止信息被吃了找不到問題
-XX:-OmitStackTraceInFastThrow
# 禁用字節(jié)碼驗證涎嚼。IDEA的代碼足夠可靠,不用驗證
-Xverify:none
# 啟用斷言機制(enable assertion)
-ea
-Dfile.encoding=UTF-8
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:ErrorFile=$USER_HOME/java_error_in_idea_%p.log
-XX:HeapDumpPath=$USER_HOME/java_error_in_idea.hprof
可見挑秉,雖然我們平時提起調優(yōu)法梯,指的都是那些相對大型的服務端應用,但是Java離我們如此之近犀概,身邊的很多東西都是可以拿來實踐的立哑。