內(nèi)容:
1.CMS收集器的解析
2.CMS收集器的使用
一,、CMS收集器的解析
1.CMS(Concurrent Mark Sweep) 并發(fā)收集,,低停頓,適合響應時間敏感的應用使用,。
2.CMS垃圾收集階段:
CMS-Initial mark(初始標記):標記GC Roots能夠關聯(lián)到的對象,。stop-the-world,暫停從root對象開始標記存活的對象,。
CMS-Concurrent mark(并發(fā)標記):GC Roots tracing,,此時業(yè)務線程仍在運行,,暫停是在并發(fā)標記之后,, 暫停所有應用程序線程,,重新標記并發(fā)標記階段遺漏的對象(在并發(fā)標記階段結束后對象狀態(tài)的更新導致),。
CMS-remark(重新標記):重新標記處理并發(fā)標記過程中因為用戶程序同時運行而導致標記產(chǎn)生變動的對象的標記記錄。stop-the-world,。
CMS-Concurrent sweep(并發(fā)清除):清除無用對象,。
CMS-concurrent-reset(并發(fā)重設):并發(fā)重設狀態(tài)等待下次CMS的觸發(fā)
二、CMS收集器的使用
1.啟用CMS:-XX:+UseConcMarkSweepGC,。
2.CMS默認啟動的回收線程數(shù)目是 (ParallelGCThreads + 3)/4) ,,如果你需要明確設定,可以通過-XX:ParallelCMSThreads=20來設定,其中ParallelGCThreads是年輕代的并行收集線程數(shù)
3.CMS是不會整理堆碎片的,,因此為了防止堆碎片引起Full GC,,通過會開啟CMS階段進行合并碎片選項:-XX:+UseCMSCompactAtFullCollection,開啟這個選項一定程度上會影響性能,。
4.為了減少第二次暫停的時間,,開啟并行remark: -XX:+CMSParallelRemarkEnabled。如果remark還是過長的話,,可以開啟-XX:+CMSScavengeBeforeRemark選項,,強制remark之前開始一次Minor GC,減少remark的暫停時間,,但是在remark之后也將立即開始又一次Minor GC,。
5.為了避免Perm區(qū)滿引起的Full GC,建議開啟CMS回收Perm區(qū)選項:
+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled
6.默認CMS是在tenured generation沾滿68%的時候開始進行CMS收集,,如果你的年老代增長不是那么快,,并且希望降低CMS次數(shù)的話,可以適當調高此值:
-XX:CMSInitiatingOccupancyFraction=80
這里修改成80%沾滿的時候才開始CMS回收,。
7.年輕代的并行收集線程數(shù)默認是(cpu <= 8) ? cpu : 3 + ((cpu * 5) / 8),,如果你希望降低這個線程數(shù),可以通過-XX:ParallelGCThreads= N 來調整,。
8.進入重點,,在初步設置了一些參數(shù)后,,例如:
-server -Xms1536m -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=64m -XX:MaxPermSize=64m -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=80 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0
|