你的 IntelliJ IDEA 卡不卡呢?
點(diǎn)擊上方?程序IT圈,選擇?設(shè)為星標(biāo)
優(yōu)質(zhì)文章,及時(shí)送達(dá)
作者:OneAPM
鏈接:blog.oneapm.com/apm-tech/426.html

Don’t be a Scrooge and give your IDE some more memory
不要做守財(cái)奴,給IDE多留點(diǎn)內(nèi)存吧。
昨天,大家就是否自定義 IntelliJ IDEA 的內(nèi)存設(shè)置進(jìn)行了討論,有些人選擇默認(rèn)設(shè)置,有些人會(huì)對(duì)默認(rèn)的設(shè)置進(jìn)行簡(jiǎn)單的變更,還有一些開(kāi)發(fā)者會(huì)基于他們的需求進(jìn)行全面復(fù)雜的設(shè)置。筆者目前的工作是處理幾個(gè)微服務(wù)項(xiàng)目和一個(gè)老項(xiàng)目,而客戶的核心業(yè)務(wù)需求非常大。對(duì) IntelliJ IDEA 內(nèi)存進(jìn)行簡(jiǎn)單設(shè)置以后,筆者明顯感受到了該 IDE 在速度和響應(yīng)方面的改善。但當(dāng)時(shí)筆者并未進(jìn)行具體的測(cè)量,所以這只是主觀感受而已。
不過(guò),參與討論的一位開(kāi)發(fā)者給筆者發(fā)了一份他的設(shè)置,雖然是針對(duì)同個(gè)項(xiàng)目,該設(shè)置卻極其復(fù)雜。筆者對(duì)自己的設(shè)置并無(wú)不滿,但非常好奇,這些完全不同的設(shè)置對(duì)比 JetBrains 提供的默認(rèn)設(shè)置,會(huì)有怎樣的不同。
公眾號(hào)所有 IDEA 文章我都整理成了 PDF ,可關(guān)注微信公眾號(hào) Java后端,回復(fù) 666 下載。
目標(biāo)
筆者的計(jì)劃是,在一個(gè)接近日常開(kāi)發(fā)項(xiàng)目的場(chǎng)景下(加載一個(gè)大項(xiàng)目、加載2、3個(gè)微服務(wù)、git pull 后刷新大項(xiàng)目),測(cè)試各個(gè)設(shè)置帶來(lái)的效果,并選出內(nèi)存消耗和速度都達(dá)到最優(yōu)時(shí)的最佳設(shè)置。
測(cè)試機(jī)器和項(xiàng)目
筆記本電腦:MacBook Pro Retina, 2.3GHz Intel Core i7, 16GB 1600Mhz DDR3,SSD Disc, OS X Yosemite
大項(xiàng)目—— Monolith ,70萬(wàn)行代碼( Java 8 和 Groovy ),303個(gè)Gradle模塊 兩個(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 等等) ? 打開(kāi) Idea(測(cè)試時(shí)間) ? 打開(kāi)大項(xiàng)目(測(cè)試時(shí)間) ? 檢查 jstat -gcutil ? 打開(kāi)兩個(gè)微服務(wù)項(xiàng)目(測(cè)試時(shí)間) ? 檢查 jstat -gcutil ? 返回大項(xiàng)目然后點(diǎn)擊“刷新 Gradle 項(xiàng)目”按鈕(測(cè)試時(shí)間) ? 檢查 jstat -gcutil
jstat -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.這個(gè)命令的輸出結(jié)果如下: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在本文中,最重要的參數(shù)是 GC 事件( YGC 和 FGC )次數(shù)和收集時(shí)間( YGCT 和 FGCT )。測(cè)試設(shè)置
默認(rèn)(灰色標(biāo)識(shí))
-Xms128m
-Xmx750m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=240m
-XX:+UseCompressedOopsBig(大)(紅色標(biāo)識(shí))
-Xms1024m
-Xmx4096m
-XX:ReservedCodeCacheSize=1024m
-XX:+UseCompressedOopsBalanced(平衡的)(藍(lán)色標(biāo)識(shí))
-Xms2g
-Xmx2g
-XX:ReservedCodeCacheSize=1024m
-XX:+UseCompressedOopsSophisticated(復(fù)雜的)(橘色標(biāo)識(shí))
-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è)置)結(jié)果
Idea啟動(dòng)時(shí)間

加載大項(xiàng)目花費(fèi)的時(shí)間
jstat -gcutil 

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

再次使用jstat –gcutil


最后的角逐:重新加載Monolith

最后一次使用jstat-gcutil


總結(jié)
討論
(END)
最近好文分享
MySQL如何實(shí)現(xiàn)每秒 570000 的寫(xiě)入?
Hibernate 和 MyBatis 哪個(gè)更好用?
更多請(qǐng)掃碼關(guān)注???Java后端編程
