JVM從入門到精通(十):垃圾回收算法串講:CMS,G1,三色標記算法

CMS

在這裏插入圖片描述

  • 併發回收,工作線程和GC線程同時進行,暫停時間短

  • 老年代

  • 分爲 四個階段

    • 初始標記:需要STW,因爲初始的垃圾並不多,因此耗費的時間不長
      在這裏插入圖片描述
    • 併發標記:垃圾回收線程和工作線程同時執行。一邊產生垃圾,一邊標記(最耗時的階段,不過是併發的)
    • 重新標記:STW,對併發標記的過程中新產生的垃圾進行重新標記 / 取消標記
    • 併發清理:清理的過程也會產生新的“浮動垃圾”,需要等下一次CMS重新運行的時候再次清理
  • CMS 存在的 問題

    • Memory Fragmentation 內存碎片問題: 標記清除會產生碎片化,如果老年代不能再分配位置,CMS會讓 Serial Old 來清理,效率很低。
    • Floating Garbage 浮動垃圾問題:如果老年代滿了,浮動垃圾還沒有清理完,會讓 Serial Old 清理。
    • 解決:降低觸發 CMS 的閾值,保持老年代有足夠的空間
    • java -XX:+PrintFlagsFinal -version | grep CMSInitiatingOccupancyFraction
      在這裏插入圖片描述

G1

垃圾優先的垃圾回收器:
G1把內存空間分爲一塊一塊的region。當G1垃圾回收器發現有必要進行垃圾回收的時候,它會優先回收存活對象最少的region,也就是垃圾最多的region。這就是“垃圾優先”。
在這裏插入圖片描述
設計架構的兩大重要思想:
1、分而治之的思想(Hbase,各種分庫分表等等)
2、分層的思想(網絡七層模型)

G1把內存分爲一塊一塊的 region
每一塊 region 有自己的邏輯分代:

  • old
  • suvivor
  • eden
  • humongous

在這裏插入圖片描述

在這裏插入圖片描述
大對象

在這裏插入圖片描述
G1 也是有 FGC的,對象分配不下的時候,就會產生FGC。

在這裏插入圖片描述
如果G1產生FGC,你應該做什麼?
1. 擴內存
2. 提高CPU性能(回收的快,業務邏輯產生對象的速度固定,垃圾回收越快,內存空間越大)
3. 降低MixedGC觸發的閾值,讓MixedGC提早發生(默認是45%)

在這裏插入圖片描述

特點
適用於需要特別快的響應時間的場景(不需要很高吞吐量)
新老年代的比例是動態的,5%-60%,一般不用手工指定,也不要手工指定。因爲這是G1預測停頓時間的基準。它會根據上次回收的時間,進行動態的調整。
在這裏插入圖片描述
先把這兩個名詞背下來,我們待會兒再講

  • 三色標記
  • 顏色指針

在這裏插入圖片描述
在這裏插入圖片描述
card table
我們補充一個概念叫 card table,這是一張用來記錄 card 的表,是一個位圖。card 是類似於 page,是一頁一頁的,對象位於card內部
在這裏插入圖片描述
在這裏插入圖片描述
阿里的多租戶JVM:趙海平他們做的…,專門針對webapplication的,session base的應用。請求來訪問,形成垃圾,請求走了,垃圾就被回收了。
在這裏插入圖片描述
Cset:collection set
有哪些需要被回收,會收集到表格裏。
在這裏插入圖片描述
Rset:remembered set

每一的region
在這裏插入圖片描述

併發標記算法

在這裏插入圖片描述
CMS 和 G1 用到的都是三色標記算法。
把對象在邏輯上分成三種顏色。
1、第一種顏色是黑色。他自己是不是垃圾已經被標記完了,而且成員變量會牽扯到他引用的一些對象,也已經標記完了。這時候我們稱之爲這個對象是黑色。
2、第二種是灰色。本身標記完了,但是還沒有標記到他所引用的那些對象也用的那些對象,還是白色沒有標記到的,所以這個時候他叫做灰色。
3、還有就是第三種是白色,就是沒被標記到的對象,這些對象是白色的。
在這裏插入圖片描述
漏標發生的情況:
在這裏插入圖片描述
在這裏插入圖片描述
打破上述兩個條件之一即可:
在這裏插入圖片描述
爲什麼G1使用SATB?

在這裏插入圖片描述
Rset會不會影響賦值的效率?會!

  • 由於Rset的存在,那麼每次給對象複製引用的時候,就得做一些額外的操作。
  • 指的是在Rset中做一些額外的記錄(比如說記錄有哪些引用指向了我的對象等等,這些操作在GC中被稱爲寫屏障)。這個寫屏障不是之前說的內存屏障,而是GC專有的寫屏障。
  • 會影響賦值的效率。 沒有銀彈!NO Silver Bullet!只有特定條件下特定的解決方案,沒有通用的解決方案。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章