目錄
五泛豪、關(guān)系圖
一、背景
? ? ? 前面的章節(jié)單獨(dú)說(shuō)了下CMS和G1侦鹏,而更早的收集器如并沒(méi)有被淘汰诡曙,當(dāng)CMS和G1收集失敗后會(huì)轉(zhuǎn)為使用Serial Old收集器進(jìn)行一次full gc,所以學(xué)習(xí)其他的收集器也是有必要的略水。? ?
二价卤、垃圾收集器比較
垃圾收集器特點(diǎn)適合場(chǎng)景
Serial(新生代)單線程全程STW流量小、內(nèi)存<4G渊涝、單核
Serial Old(老)同上同上
ParNew(新)Serial的多線程版本搭配CMS實(shí)現(xiàn)低停頓
ParallelScavenge(新)可設(shè)置最大gc停頓時(shí)間及gc時(shí)間比吞吐高(用戶(hù)時(shí)間/用戶(hù)+GC)慎璧,適用于非交互式床嫌,如批處理應(yīng)用
Parallel?Old(老)同上同上
CMS(老年代)低停頓、易產(chǎn)生內(nèi)存碎片想低停頓但可以容忍較多的fgc
G1(新+老)低停頓胸私、不易產(chǎn)生內(nèi)存碎片內(nèi)存>=6G厌处、停頓可控、不容忍頻繁fgc
ZGC(新+老)STW不超過(guò)10毫秒
STW不會(huì)隨堆大小而增加
堆范圍幾百M(fèi)~幾TB岁疼。
使用大中小內(nèi)存低停頓為目標(biāo)
G1的目標(biāo)是淘汰CMS阔涉,ZGC的目標(biāo)是淘汰G1
三、常用JVM參數(shù)
CMS和G1相關(guān)的參數(shù)在上2篇章節(jié)已說(shuō)明五续,這里不再列洒敏。
參數(shù)意義優(yōu)化建議默認(rèn)值
-Xms2000m? 設(shè)置堆初始2G同Xmx,避免動(dòng)態(tài)調(diào)整疙驾,默認(rèn)空余堆內(nèi)存小于40%會(huì)調(diào)增大于70%會(huì)調(diào)小物理內(nèi)存的1/64
-Xmx2000m設(shè)置堆最大2G同Xms物理內(nèi)存的1/4
-Xss每個(gè)線程的棧大小無(wú)特殊不要超過(guò)默認(rèn)值凶伙,否則會(huì)影響線程數(shù)1M
-XX:NewRatio=4?年輕代(eden+2s):老年代=1:4若已設(shè)置xmn,不需設(shè)此參數(shù)它碎,另外選擇G1和ZGC不建議設(shè)此參數(shù)2
-XX:SurvivorRatio=82s:eden=1:8G1和ZGC動(dòng)態(tài)分配不建議設(shè)置此參數(shù)8
-XX:MaxGCPauseMillis=100允許的GC最大的暫停時(shí)間函荣,過(guò)小GC就會(huì)頻繁,過(guò)大暫停久太過(guò)頻繁或者暫停久可通過(guò)此參數(shù)調(diào)整200ms
-XX:+TieredCompilation使用分層編譯來(lái)提升啟動(dòng)速度默認(rèn)打開(kāi)true
-XX:CICompilerCount=N編譯線程的數(shù)目無(wú)需要不必調(diào)整4
-XX:-UseBiasedLocking 禁用偏向鎖在存在大量鎖對(duì)象的創(chuàng)建并高度并發(fā)的環(huán)境下禁用偏向鎖能夠帶來(lái)一定的性能優(yōu)化打開(kāi)
-XX:AutoBoxCacheMaxJDK默認(rèn)只緩存 -128 ~ +127的Integer 和 Long,此參數(shù)更改次值對(duì)于頻繁創(chuàng)建Integer對(duì)象的可使用此參數(shù)優(yōu)化128
-XX:+AlwaysPreTouchJAVA進(jìn)程啟動(dòng)的時(shí)候,雖然我們可以為JVM指定合適的內(nèi)存大小,但是這些內(nèi)存操作系統(tǒng)并沒(méi)有真正的分配給JVM,而是等JVM訪問(wèn)這些內(nèi)存的時(shí)候,才真正分配,這樣會(huì)造成以下問(wèn)題扳肛。
1傻挂、GC的時(shí)候,新生代的對(duì)象要晉升到老年代的時(shí)候,需要內(nèi)存,這個(gè)時(shí)候操作系統(tǒng)才真正分配內(nèi)存,這樣就會(huì)加大young gc的停頓時(shí)間;
2、可能存在內(nèi)存碎片的問(wèn)題挖息。
JVM就會(huì)先訪問(wèn)所有分配給它的內(nèi)存,讓操作系統(tǒng)把內(nèi)存真正的分配給JVM.后續(xù)JVM就可以順暢的訪問(wèn)內(nèi)存了金拒。
false
-XX:-OmitStackTraceInFastThrow拋出相同的異常N次之后,JVM會(huì)對(duì)某些特定異常如NPE進(jìn)行優(yōu)化套腹,不再帶異常棧绪抛。如日志里一條條Nul Point Exception不接收此操作,可以關(guān)閉true
-XX:+PrintGCApplicationStoppedTime除了打印清晰的完整的GC停頓時(shí)間外电禀,還可以打印其他的JVM停頓時(shí)間打開(kāi)false
-XX:+PrintPromotionFailure打開(kāi)了就知道是多大的新生代對(duì)象晉升到老生代失敗從而引發(fā)Fgc打開(kāi)false
比較通用的配置方案:
JVM_ARGS="-server -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Djava.io.tmpdir=/tmp -Djava.net.preferIPv6Addresses=false"
JVM_GC="-XX:+UseG1GC -XX:G1HeapRegionSize=4M -XX:InitiatingHeapOccupancyPercent=40 -XX:MaxGCPauseMillis=100? -XX:-UseBiasedLocking -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+PrintGCDateStamps -XX:+PrintStringTableStatistics -XX:+PrintAdaptiveSizePolicy -XX:+PrintGCApplicationStoppedTime -XX:+PrintFlagsFinal -XX:-UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -Xloggc:$LOG_PATH/gc.log -XX:ErrorFile=$LOG_PATH/vmerr.log? -Xss512k -Xmx"$jvmSize" -Xms"$jvmSize" -XX:MetaspaceSize="$MaxMetaspaceSize" -XX:MaxMetaspaceSize="$MaxMetaspaceSize" -XX:+AlwaysPreTouch -XX:ReservedCodeCacheSize="$ReservedCodeCacheSize" -XX:InitialCodeCacheSize="$InitialCodeCacheSize" -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$LOG_PATH"
其中
case Using G1 GC
case 1G: Xms=512m MaxMetaspaceSize=64m ReservedCodeCacheSize=32m InitialCodeCacheSize=32m
case2G:? Xms=1g MaxMetaspaceSize=128m ReservedCodeCacheSize=64m InitialCodeCacheSize=64m
case4G:? Xms=2g MaxMetaspaceSize=256m ReservedCodeCacheSize=64m InitialCodeCacheSize=64m
case8G:? Xms=4g MaxMetaspaceSize=256m ReservedCodeCacheSize=128m InitialCodeCacheSize=128m
case16G:Xms=12g MaxMetaspaceSize=512m ReservedCodeCacheSize=256m InitialCodeCacheSize=256m
case22~28G:? Xms=18g MaxMetaspaceSize=512m ReservedCodeCacheSize=256m InitialCodeCacheSize=256m
case32~44G:? Xms=24g MaxMetaspaceSize=1g ReservedCodeCacheSize=512m InitialCodeCacheSize=512m
case64~88G:? Xms=32g MaxMetaspaceSize=2g ReservedCodeCacheSize=1g InitialCodeCacheSize=1g
四幢码、垃圾收集器對(duì)比
CMS和G1在上2章節(jié)已說(shuō)明。
簡(jiǎn)介新/老基于算法
簡(jiǎn)介新/老基于算法
Serial單線程尖飞,全程STW新生代復(fù)制
ParNewSerial的多線程版本新生代復(fù)制
Parallel Scavenge可以通過(guò)調(diào)整參數(shù)症副,控制停頓時(shí)間或最大的吞吐量新生代復(fù)制
Serial Old單線程,CMS和G1失敗采用此老年代標(biāo)記整理
Parallel Old可以通過(guò)調(diào)整參數(shù)政基,控制停頓時(shí)間或最大的吞吐量老年代標(biāo)記整理
五贞铣、關(guān)系圖