Java虛擬機 -- 垃圾收集器

介紹垃圾收集器之前先要了解三個知識點:

  • Stop-the-World
    • JVM由於要執行GC而停止應用程序的執行
    • 任何一種GC算法中都會發生
    • 多數GC優化通過減少Stop-the-world發生的時間來提高程序性能
  • Safepoint(安全點):程序執行時並非在所有的地方都能停頓下來開始GC,只有在到達安全點時纔可以停止GC。
    • 分析過程中對象引用關係不會發生變化的點
    • 產生Safepoint的地方:方法調用,循環跳轉,異常跳轉
    • 安全點的數量要適中,不能太少而導致GC等待時間太長,也不能過於頻繁以致於過分增大運行時的負荷。
  • JVM的運行模式
    • Server:啓動較慢,但是進入到運行穩定期後,運行速度更快,這是因爲Server啓動的是重量級的虛擬機,對程序進行了更多的優化
    • Client:啓動較快,啓動輕量級虛擬機
    • java -version 查看使用哪種虛擬機

 

新生代垃圾收集器

Serial收集器(-XX:+UseSerialGC,複製算法)可以指定年輕代的垃圾回收器

  • 單線程收集,進行垃圾收集時,必須暫停所有工作線程
  • 簡單而高效,Client模式下默認的年輕代收集器

ParNew收集器(-XX:+UseParNewGC,複製算法)

  • 多線程收集,其餘行爲,特點和Serial收集器一樣
  • 單核執行效率不如Serial,在多核下執行纔有優勢
  • 默認開啓的收集線程數與CPU數量相同

Parallel Scavenge收集器 -- 吞吐量優先收集器(-XX:UseParallelGC,複製算法)

  • 吞吐量 = 運行用戶代碼時間 /(運行用戶代碼時間+垃圾收集時間)
    • CPU用於運行用戶代碼的時間與CPU總消耗時間的比值,比如,虛擬機總共運行了100分鐘,其中垃圾回收花費1分鐘,那吞吐量就是99%。
  • 比起關注用戶線程停頓時間(CMS等收集器,停頓時間越短就越適合需要與用戶交互的程序,良好的響應速度能提升用戶體驗),更關注系統的吞吐量(能更好的利用CPU,適合在後臺運行,而不需要太多交互)
  • 在多核下執行纔有優勢,Server模式下默認的年輕代收集器
  • GC自適應調節策略
    • -XX:+UseAdaptiveSizePolicy 通過打開該參數可以讓收集器根據當前系統的運行情況自適應的調節最合適的停頓時間或者最大吞吐量

老年代垃圾收集器

Serial Old收集器(-XX:+UseSerialOldGC,標記-整理算法)

  • 單線程收集,進行垃圾收集時,必須暫停所有工作線程
  • 簡單高效,Client模式下默認的老年代收集器

Parallel Old收集器 JDK6 (-XX:+UseParallelOldGC,標記-整理算法)

  • 多線程,吞吐量優先
  • 經常與Parallel Scaveng配合使用與注重吞吐量以及CPU敏感的場合

CMS收集器 併發收集,低停頓(-XX:+UseConcMarkSweepGC,標記-清除算法) 注重服務器的響應速度

執行流程:

  • 初始標記:stop-the-world
  • 併發標記:併發追溯標記,程序不會停頓
  • 併發預清理:查找執行併發標記階段從年輕代晉升到老年代的對象
  • 重新標記:暫停虛擬機,掃描CMS堆中的剩餘對象
  • 併發清理:清理垃圾對象,程序不會停頓
  • 併發重置:重置CMS收集器的數據結構

缺點:

  • 會產生空間碎片,CMS提供一個 -XX:+UseCMSCompactAtFullCollection 開關參數(默認是開啓的),用於在CMS收集器不要進行FullGC時開啓內存碎片的合併整理過程,內存整理的過程是無法併發的,空間碎片問題沒有,但停頓時間就會變長。
  • 浮動垃圾:由於CMS併發清理階段用戶線程還在運行着,伴隨程序運行自然會有新垃圾產生,這部分垃圾得標記過程之後,所以CMS無法在當收集中處理掉他們,只好留待下一次GC清理掉,這一部分垃圾稱爲浮動垃圾。在jdk1.5默認設置下,CMS收集器當老年代使用了68%的空間就會被激活,可以通過-XX:CMSInitialOccupancyFraction的值來提高觸發百分比,在jdk1.6中CMS啓動閾值提升到了92%,要是CMS運行期間預留的內存無法滿足程序的需要,就會出現”Concurrent Mode Failure“,然後降級臨時啓用Serial Old收集器進行老年代的垃圾收集,這樣停頓時間就很長了,所以-XX:CMSInitialOccupancyFraction設置太高容易導致大量”Concurrent Mode Failure“,併發模式失敗。
  • 對CPU資源敏感,CMS默認啓動的回收線程數是(cpu數量+3)/4。所以CPU數量少會導致用戶程序執行速度降低較多。

G1收集器:(-XX:+UseG1GC,複製+標記-整理算法)

  • 併發與並行
  • 分代收集
  • 空間整合
  • 可預測的停頓

    好文傳送門 --->  G1收集器入門

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章