總結CMS常見面試題

談談對CMS的認知?

CMS(concurrent mark sweep)在jdk1.5中已經開始使用了,2004年9月30日,JDK1.5發佈。CMS設計的目標就是獲取最低停頓時間(stop the world停頓時間),它是基於 標記-清除算法實現的。經常使用的場景是互聯網網站(對服務響應要求較高),它是一個老年代垃圾收集器,能夠和 Serial收集器, Parallel New收集器配合使用。當並行模式(concurrent mode failure)失敗時CMS會退化成 Serial Old.

CMS收集器的工做流程(步驟)是什麼樣的?

主要四個階段
  • 初始標記:只標記和GC Roots能直連的對象,速度快,會發生(stop the world)
  • 併發標記:和應用線程併發執行,遍歷初始標記階段標記過的對象,標記這些對象的可達對象。
  • 從新標記:因爲併發標記是和應用線程是併發執行的,因此有些標記過的對象發生了變化。這個過程比初始標記用時長,可是比併發標記階段用時短。會發生(stop the world)
  • 併發清除:和應用線程一塊兒運行。基於標記對象,直接清理對象。

CMS的缺點?

垃圾碎片問題

  • 緣由:因爲CMS採用的是標記-清除算法,因此不可避免會有內存碎片問題。
  • 解決:使用-XX:+CMSFullGCsBeforeCompaction=n,意思是在上次CMS併發GC執行事後,到底還要作多少Full GC才作壓縮。默認是0,也就是說每次CMS GC頂不住了轉入Full GC時都要壓縮。

併發模式失敗(concurrent mode failure)

  • 緣由:CMS垃圾清理線程和應用線程是併發執行的,若是在清理過程當中老年代空間不足不能容納新對象。
  • 解決:使用-XX:+UseCMSInitiatingOccupancyOnly-XX:CMSInitiatingOccupancyFraction=60,指定CMS對內存的佔用率到60%時開始GC。

從新標記階段時間過長

  • 解決:使用-XX:+CMSScavengeBeforeRemark,在執行從新標記以前,先作一次Young GC,目的在於較少年輕代對老年代的無效引用,下降從新標記的開銷。

爲何配置了CMS GC,卻觸發了Full GC?

  • 大對象分配時,年輕代放不下,直接去老年代,結果老年代也放不下。
  • 內存碎片問題(使用標記-清除算法的缺點)
  • CMS GC失敗(concurrent mode failure致使)
  • jmap -histo 人爲執行了命令

相關文章
相關標籤/搜索