JVM通用配置 以及GC日志說(shuō)明

堆空間的常用配置

-Xms  -Xmx 設(shè)置堆空間的大小  推薦設(shè)置成相同 -Xmx8G -Xms8G 可以防止JVM動(dòng)態(tài)調(diào)整而消耗性能
-Xss512: 設(shè)置每個(gè)線程的堆棧大小。JDK5.0以后每個(gè)線程堆棧大小為1M,以前每個(gè)線程堆棧大小為256K。更具應(yīng)用的線程所
需內(nèi)存大小進(jìn)行調(diào)整。在相同物理內(nèi) 存下,減小這個(gè)值能生成更多的線程。但是操作系統(tǒng)對(duì)一個(gè)進(jìn)程內(nèi)的線程數(shù)還是有限制的
不能無(wú)限生成,經(jīng)驗(yàn)值在3000~5000左右。
---------------堆空間相關(guān)配置------------------
-XX:NewSize:   -XX:MaxNewSize:  新生代 最大新生代   這個(gè)優(yōu)先級(jí)優(yōu)于下面
-Xmn             相當(dāng)于 NewSize = MaxNewSize       這個(gè)優(yōu)先級(jí)優(yōu)于下面
-XX:NewRatio=3  意味著年輕代和老年代之間的比率為1:3。也就是說(shuō)伊甸園和幸存者空間的總大小將是堆總大小的四分之一   這個(gè)優(yōu)先級(jí)最低   默認(rèn)值是2
-XX:SurvivorRatio=8  默認(rèn)是8 eden:Form:To = 8:1:1 比如:SurvivorRatio=6。那么幸存者空間將是年輕一代的八分之一(而不是七分之一,因?yàn)橛袃蓚€(gè)幸存者空間)。
-XX:MetaspaceSize:  -XX:MaxMetaspaceSize  元空間大小  JDK8以后使用的本地內(nèi)存 要控制好范圍
-XX:MaxDirectMemorySize=2G  直接內(nèi)存 默認(rèn)和堆內(nèi)存最大值一樣 不受java堆大小限制 NIO零拷貝會(huì)用到 最好設(shè)置約束下
-XX:MaxTenuringThreshold=threshold 設(shè)置自適應(yīng)GC分代中使用的最大使用閾值。最大的值是15。對(duì)于并行(吞吐量)收集器,默認(rèn)值是15,對(duì)于CMS收集器,默認(rèn)值是6。

-XX:-UseTLAB 關(guān)閉 TLAB:ThreadLocalAllocBuffer 事先在堆里面為每個(gè)線程分配一塊私有內(nèi)存 原子性   默認(rèn)開(kāi)啟(建議開(kāi)啟)
-XX:TLABSize=512k  設(shè)置TLAB的大小
-XX:PretenureSizeThreshold 默認(rèn)0不管多大都是先在eden中分配內(nèi)存 當(dāng)超過(guò)eden區(qū)的大小的時(shí)候,才分配到old區(qū)。
 大于該值大小的對(duì)象直接在老年代分配(單位字節(jié))  自己看著辦設(shè)置

-XX:+DoEscapeAnalysis  開(kāi)啟逃逸分析 對(duì)象作用域逃出函數(shù) 就是在方法new了個(gè)對(duì)象并把這個(gè)對(duì)象返回出去了  需要配合下面一起才生效 默認(rèn)開(kāi)啟
-XX:+EliminateAllocations 標(biāo)量替換 分析出成員變量沒(méi)有逃逸 把其分配到局部變量也就是棧中 這樣就不需要垃圾回收   默認(rèn)開(kāi)啟

CMS參數(shù)配置說(shuō)明

1、增量收集  -XX:CMSInitiatingOccupancyFraction=80   判斷當(dāng)前 Old 區(qū)使用率是否大于閾值,則觸發(fā) CMS GC 默認(rèn)百分之92 降低觸發(fā)CMS GC的閾值,
讓CMS GC盡早執(zhí)行,以保證有足夠的連續(xù)空間,也減少 Old 區(qū)空間的使用大小 
另外需要使用 -XX:+UseCMSInitiatingOccupancyOnly 來(lái)配合使用,不然 JVM 僅在第一次使用設(shè)定值,后續(xù)則自動(dòng)調(diào)整

-XX:+ParallelRefProcEnabled 對(duì) Reference 進(jìn)行并行處理。
-XX:+CMSClassUnloadingEnabled  這會(huì)使得 CMS 在 CMS-Remark 階段嘗試進(jìn)行類的卸載 對(duì) MetaSpace 或 Perm 進(jìn)行垃圾收集,默認(rèn)關(guān)閉, ps:最好不要處理

2、內(nèi)存碎片  -XX:+UseCMSCompactAtFullCollection  來(lái)控制 Full GC的過(guò)程中是否進(jìn)行空間的整理(默認(rèn)開(kāi)啟 是Full GC,不是CMS GC)
-XX:CMSFullGCsBeforeCompaction=0  來(lái)控制多少次 Full GC 后進(jìn)行一次壓縮  

3、浮動(dòng)垃圾: 視情況控制每次晉升對(duì)象的大小,或者縮短每次 CMS GC 的時(shí)間,必要時(shí)可調(diào)節(jié) NewRatio 的值。
另外就是使用 -XX:+CMSScavengeBeforeRemark 在FullGc過(guò)程中提前觸發(fā)一次 Young GC,防止后續(xù)晉升過(guò)多對(duì)象。

G1參數(shù)配置說(shuō)明

 正常來(lái)說(shuō),大部分在 Young 的對(duì)象都不會(huì)存活很長(zhǎng)時(shí)間。如果 Young gc 中,花費(fèi)了大量的時(shí)間
如果不符合 (大部分在 Young 的對(duì)象都不會(huì)存活很長(zhǎng)時(shí)間)這個(gè)規(guī)則,你可能需要調(diào)整一下 Young 區(qū)域占比。來(lái)降低 Young 對(duì)象的拷貝時(shí)間。
-XX:G1NewSizePercent (默認(rèn):5) Young region 最小值
-XX:G1MaxNewSizePercent (默認(rèn): 60) Young region 最大值

Mixed gc 會(huì)選取所有的 Young region + 收益高的若干個(gè) Old region
-XX:G1MaxNewSizePercent 與 Young 關(guān)聯(lián)
-XX:MixedGCCountTarget 與 old 關(guān)聯(lián)
-XX:MixedGCCountTarget默認(rèn)是8,意味著要在8次以內(nèi)回收完所有的 old region
換句話說(shuō),如果你有 800 個(gè) old region, 那么一次 mixed gc 最大會(huì)回收 100 個(gè) old region
G1 也可以被調(diào)整成不做這么多工作,也就是回收少點(diǎn),浪費(fèi)堆內(nèi)存
-XX:G1MixedGCLiveThresholdPercent(默認(rèn):85)可能會(huì)提高堆使用率
-XX:G1HeapWastePercent (默認(rèn):5) 如果可回收低于這個(gè)值, 那么將不會(huì)啟動(dòng)Mixed gc

-XX:MaxGCPauseMillis   G1會(huì)盡量滿足這個(gè)參數(shù)設(shè)定的目標(biāo)時(shí)間,通過(guò)此參數(shù)可以平衡應(yīng)用需要的吞吐量以及延時(shí)

ZGC參數(shù)配置說(shuō)明

-XX:ReservedCodeCacheSize -XX:InitialCodeCacheSize:設(shè)置CodeCache的大小, JIT編譯的代碼都放在CodeCache中,一般服務(wù)64m或128m就已經(jīng)足夠。
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC:?jiǎn)⒂肸GC的配置。 
-XX:ConcGCThreads:并發(fā)回收垃圾的線程。默認(rèn)是總核數(shù)的12.5%,8核CPU默認(rèn)是1。調(diào)大后GC變快,但會(huì)占用程序運(yùn)行時(shí)的CPU資源,吞吐會(huì)受到影響。
-XX:ParallelGCThreads:STW階段使用線程數(shù),默認(rèn)是總核數(shù)的60%。 
-XX:ZCollectionInterval:ZGC發(fā)生的最小時(shí)間間隔,單位秒。
-XX:ZAllocationSpikeTolerance:ZGC觸發(fā)自適應(yīng)算法的修正系數(shù),默認(rèn)2,數(shù)值越大,越早的觸發(fā)ZGC。 
-XX:+UnlockDiagnosticVMOptions -XX:-ZProactive:是否啟用主動(dòng)回收,默認(rèn)開(kāi)啟,這里的配置表示關(guān)閉。

GC日志中每一行都注明了GC過(guò)程中的信息,關(guān)鍵信息如下:
Start:開(kāi)始GC,并標(biāo)明的GC觸發(fā)的原因。上圖中觸發(fā)原因是自適應(yīng)算法。
Phase-Pause Mark Start:初始標(biāo)記,會(huì)STW。
Phase-Pause Mark End:再次標(biāo)記,會(huì)STW。
Phase-Pause Relocate Start:初始轉(zhuǎn)移,會(huì)STW。
Heap信息:記錄了GC過(guò)程中Mark、Relocate前后的堆大小變化狀況。High和Low記錄了其中的最大值和最小值,我們一般關(guān)注High中Used的值
如果達(dá)到100%,在GC過(guò)程中一定存在內(nèi)存分配不足的情況,需要調(diào)整GC的觸發(fā)時(shí)機(jī),更早或者更快地進(jìn)行GC。
GC信息統(tǒng)計(jì):可以定時(shí)的打印垃圾收集信息,觀察10秒內(nèi)、10分鐘內(nèi)、10個(gè)小時(shí)內(nèi),從啟動(dòng)到現(xiàn)在的所有統(tǒng)計(jì)信息。利用這些統(tǒng)計(jì)信息,可以排查定位一些異常點(diǎn)。
image.png

個(gè)人建議

1、設(shè)置-Xms -Xmx 設(shè)置成一樣的大小 減少動(dòng)態(tài)調(diào)整分代帶來(lái)的開(kāi)銷(本地提前測(cè)試 一般情況下 永久代的大小應(yīng)當(dāng)為活躍對(duì)象的 2~3 倍左右,考慮到浮動(dòng)垃圾問(wèn)題最好在 3 倍左右,剩下的都可以分給 Young 區(qū))。
2、棧大小一般 256k 就夠用了(除非代碼中有很深的調(diào)用鏈)。
3、方法區(qū)內(nèi)存: 與堆處于平行的空間 不屬于堆和棧。
4、在一個(gè)方法區(qū)內(nèi)頻繁創(chuàng)建對(duì)象 為了避免GC大量回收 可以開(kāi)啟逃逸分析 jdk1.8默認(rèn)開(kāi)啟。
棧空間的內(nèi)存 隨著線程的銷毀而銷毀  在棧上分配的對(duì)象所以不需要GC。
5、CGLIB技術(shù)直接操作字節(jié)碼運(yùn)行 生成大量的動(dòng)態(tài)類會(huì)導(dǎo)致,jvm堆永久代內(nèi)存溢出,排查問(wèn)題困難,在使用的時(shí)候一定要謹(jǐn)慎。
6、偏向鎖在只有一個(gè)線程使用到該鎖的時(shí)候效率很高,但是在競(jìng)爭(zhēng)激烈情況會(huì)升級(jí)成輕量級(jí)鎖,此時(shí)就需要先消除偏向鎖,這個(gè)過(guò)程是 STW 的。如果每個(gè)同步資源都走這個(gè)升級(jí)過(guò)程,開(kāi)銷會(huì)非常大,所以在已知并發(fā)激烈的前提下,一般會(huì)禁用偏向鎖 -XX:-UseBiasedLocking 來(lái)提高性能。

通用配置 (java $通用配置 -jar ***.jar)

-XX:+PrintGCDetails 開(kāi)啟打印GC詳細(xì)過(guò)程 并不會(huì)占用什么資源
-XX:+PrintGCTimeStamps | -XX:+PrintGCDateStamps 時(shí)間間隔 | 系統(tǒng)時(shí)間 方便看GC發(fā)生頻率  
-XX:+HeapDumpOnOutOfMemoryError 發(fā)生內(nèi)存溢出時(shí) 自動(dòng)生成dump日志
-Xloggc:'gc.log'  指定GC日志的地方  
-Xlog:safepoint,classhisto*=trace,age*,gc*=info:file=/opt/logs/logs/gc-%t.log:time,tid,tags:filecount=5,filesize=50m 

GC日志說(shuō)明

[圖片上傳中...(image-c2b5f4-1600391556819)]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容