1. 程式人生 > >第20課:JVM中CMS收集器解密

第20課:JVM中CMS收集器解密

內容:

    1.CMS收集器的解析     2.CMS收集器的使用

一、CMS收集器的解析

    1.CMS(Concurrent Mark Sweep) 併發收集,低停頓,適合響應時間敏感的應用使用。      2.CMS垃圾收集階段:         CMS-Initial mark(初始標記):標記GC Roots能夠關聯到的物件。stop-the-world,暫停從root物件開始標記存活的物件。         CMS-Concurrent mark(併發標記):GC Roots tracing,此時業務執行緒仍在執行,暫停是在併發標記之後, 暫停所有應用程式執行緒,重新標記併發標記階段遺漏的物件(在併發標記階段結束後物件狀態的更新導致)。         CMS-remark(重新標記):重新標記處理併發標記過程中因為使用者程式同時執行而導致標記產生變動的物件的標記記錄。stop-the-world。         CMS-Concurrent sweep(併發清除):清除無用物件。         CMS-concurrent-reset(併發重設):併發重設狀態等待下次CMS的觸發

二、CMS收集器的使用

    1.啟用CMS:-XX:+UseConcMarkSweepGC。     2.CMS預設啟動的回收執行緒數目是 (ParallelGCThreads + 3)/4) ,如果你需要明確設定,可以通過-XX:ParallelCMSThreads=20來設定,其中ParallelGCThreads是年輕代的並行收集執行緒數     3.CMS是不會整理堆碎片的,因此為了防止堆碎片引起Full GC,通過會開啟CMS階段進行合併碎片選項:-XX:+UseCMSCompactAtFullCollection,開啟這個選項一定程度上會影響效能。     4.為了減少第二次暫停的時間,開啟並行remark: -XX:+CMSParallelRemarkEnabled。如果remark還是過長的話,可以開啟-XX:+CMSScavengeBeforeRemark選項,強制remark之前開始一次Minor GC,減少remark的暫停時間,但是在remark之後也將立即開始又一次Minor GC。     5.為了避免Perm區滿引起的Full GC,建議開啟CMS回收Perm區選項:

+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled

   6.預設CMS是在tenured generation沾滿68%的時候開始進行CMS收集,如果你的年老代增長不是那麼快,並且希望降低CMS次數的話,可以適當調高此值:

 -XX:CMSInitiatingOccupancyFraction=80

    這裡修改成80%沾滿的時候才開始CMS回收。     7.年輕代的並行收集執行緒數預設是(cpu <= 8) ? cpu : 3 + ((cpu * 5) / 8),如果你希望降低這個執行緒數,可以通過-XX:ParallelGCThreads= N 來調整。     8.進入重點,在初步設定了一些引數後,例如:

    -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