增加GC相關(guān)選項(xiàng):
-verbose:gc
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=5
-XX:GCLogFileSize=512K
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+PrintTenuringDistribution
-XX:+PrintGCApplicationStoppedTime
-Xloggc:/var/app/log/Push-server/gc.log
- 如果不能確定所需內(nèi)存,使用自動(dòng)jvm自動(dòng)調(diào)優(yōu);
- 大致確定所需內(nèi)存后,使用-Xmx -Xms設(shè)置堆大小;
- 觀(guān)察GC log確定FullGC后剩余堆大小(即為活躍數(shù)據(jù)大小);
- 整個(gè)堆大小宜為老年代活躍數(shù)據(jù)大小的3-4倍;
- 永久帶大小應(yīng)該比永久帶活躍數(shù)據(jù)大1.2~1.5倍;
- 新生代空間應(yīng)該為老年代空間活躍數(shù)據(jù)的1~1.5倍;
- 通過(guò)top命令觀(guān)察棧占用空間、直接內(nèi)存占用空間,決定所需機(jī)器內(nèi)存大小;
- 新生代大小決定了Minor GC的周期和時(shí)長(zhǎng),縮短新生代大小可以減少停頓時(shí)長(zhǎng),但是增加了GC頻率;在調(diào)整新生代大小時(shí),盡量保持老年代大小不變;
- 老年代大小不應(yīng)該小于活躍數(shù)據(jù)的1.5倍;新生代空間至少為java堆大小的10%;增加堆大小時(shí),注意不要超過(guò)可用物理內(nèi)存數(shù);
- 從throughput收集器遷移到CMS時(shí),需要將老年代空間增加20%~30%;
- 新生代分為Eden和Survivor兩部分,Survivor可以通過(guò)
-XX:SurvivorRatio=xx
來(lái)控制,對(duì)應(yīng)的大小為-Xmn<value>/(ratio+2)
; - 通過(guò)
-XX:MaxTenuringThreshold=<n>
來(lái)指定晉升閾值(年齡),n為0~15之間; - 期望Survivor空間為剩余總存活對(duì)象大小的2倍(age=1;
- 注意調(diào)節(jié)Survivor大小時(shí),保持Eden大小不變;
- 如果Survivor空間足夠大,且對(duì)象大部分并未到達(dá)老年代,那么就可以將晉升年紀(jì)指定的足夠大(15)。在Eden與Survivor之間復(fù)制和CMS老年代空間壓縮之間,我們寧愿選擇前者;
- CMS必須能以對(duì)象從新生代提升到老年代的同等速度對(duì)老年代中的對(duì)象進(jìn)行收集,否則,就會(huì)失速;
- 如果觀(guān)察到'concurrent mode failures',意味著失速已經(jīng)發(fā)生,必須減少
-XX:CMSInitiatingOccupancyFraction=<percent>
的值; - 使用上述選項(xiàng)的同時(shí),最好同時(shí)使用
-XX:+UseCMSInitiatingOccupancyOnly
,強(qiáng)制使用該比例,該比例的大小應(yīng)該大于老年代占用空間和活躍數(shù)據(jù)大小之比,一般而言老年代大小*該比例>1.5*老年代活躍數(shù)據(jù)大小
; - 使用
-XX:+ExplicitGCInvokesConcurrentAndUnloadsCloasses
可以使用CMS進(jìn)行顯式垃圾回收(System.gc()
);通過(guò)-XX:+DisableExplicitGC
關(guān)閉顯示垃圾回收(慎用); - 使用
-XX:+CMSClassUnloadingEnabled
打開(kāi)永久帶垃圾回收,使用-XX:+CMSPermGenSweepingEnabled
打開(kāi)CMS對(duì)永久帶的掃描;使用-XX:CMSInitiatingPermOccupancyFraction=<perscent>
激活回收比例閾值; - 使用
-XX:ParallelGCThreads=<n>
控制掃描線(xiàn)程數(shù);使用-XX:+CMSScavengeBeforeRemark
強(qiáng)制重新標(biāo)記前進(jìn)行一次MinorGC;如果由大量的引用對(duì)象或可終結(jié)對(duì)象要處理,使用-XX:+ParallelRefProcEnabled
; - CMS包括Minor GC所帶來(lái)的開(kāi)銷(xiāo)應(yīng)該小于10%;
- 如果缺少長(zhǎng)時(shí)間調(diào)優(yōu)的條件,安全起見(jiàn),可以使用G1,僅設(shè)置如下參數(shù)即可:
-d64
-Xmx5g
-Xms5g
-XX:PermSize=100m
-XX:MaxPermSize=100m
-XX:MaxDirectMemorySize=1g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=80
G1不必明確設(shè)置新生代大小,其自動(dòng)調(diào)優(yōu)也十分可靠,對(duì)于停頓時(shí)間往往在長(zhǎng)時(shí)間運(yùn)行后可以達(dá)到預(yù)期效果;對(duì)吞吐量?jī)?yōu)先的應(yīng)用,可能不是那么明顯。