<input id="0qass"><u id="0qass"></u></input>
  • <input id="0qass"><u id="0qass"></u></input>
  • <menu id="0qass"><u id="0qass"></u></menu>

    JVM之三色標記算法

    架構師 專欄收錄該內容
    10 篇文章 0 訂閱

    前言
    前面的文章里講到過JVM通過可達性分析算法進行垃圾回收,那么可達性分析算法它分析完了以后是怎樣進行記錄的呢,它怎么知道哪些是垃圾對象哪些不是垃圾對象呢,今天我們來講解一下三色標記算法。下面我先介紹一下理論,但是單看理論可能太抽象,請再結合我后面的圖片進行分析思考。
    理論
    黑色:表示對象已經被垃圾收集器訪問過,且這個對象的所有引用都已經掃描過。黑色的對象代表已經掃描過,它是安全存活的。
    灰色:表示對象已經被垃圾收集器訪問過,但是這個對象上至少存在一個引用還沒有被掃描過。
    白色:表示對象尚未被垃圾收集器訪問過。
    圖片分析
    在這里插入圖片描述
    圖中黑色箭頭代表對象之間的引用,紅色箭頭代表垃圾收集器掃描的路徑,第一張圖因為掃描器還沒有進行掃描,所以所有的對象都是白色的。
    一、第一次掃描
    在這里插入圖片描述
    第一次掃描到了A對象,但是A對象下面的直接引用對象還有未掃描到的對象B和對象C,所以A對象為灰色。
    二、第二次掃描
    在這里插入圖片描述
    第二次掃描到了B對象,但是B對象下面還有一個直接引用對象D沒有被掃描到,所以B對象變為灰色,然而A對象下面有一個直接引用對象C沒有被掃描到,所以A對象也還是灰色。這里再次強調一下紅色連線代表掃描的路徑以及掃描到的對象,黑色連線代表對象之間的引用,之所以畫兩個箭頭引用就是為了讓大家區分開箭頭所代表的不同含義。
    三、第三次掃描
    在這里插入圖片描述
    第三次掃描從A對象掃描到了B對象,由于B對象下面沒有未被掃描的對象了(因為B下面已經沒有引用的對象了),所以B為黑色,而A對象也因為下面的直接引用對象B和C都已經被掃描過了,所以A也變為了黑色,而B下面的D對象還沒有被掃描過,所以B還是灰色。
    四、第四次掃描
    在這里插入圖片描述
    第四次掃描從B掃描到了D對象,因為D對象下面沒有引用對象了,所以D變為黑色了,而B下面也沒有未被掃描過的對象了,所以B對象也變為了黑色,這個時候掃描器就結束掃描過程了,大家看到了掃描器并沒有掃描E對象,這是因為兩點,1、E對象不是GCRoot根,掃描器是從GCRoot根節點開始掃描的,也就是從圖中A對象開始掃描。2、E對象沒有被GCRoot根節點或者根節點引用下的節點引用,假如這個時候A、B、C、D任何一個對象引用E對象,E對象都會變為黑色,而目前圖中的E對象就相當于我們在程序里面new了一個Strudent對象,但是沒有任何對象使用它或者調用它,它就相當于在程序里面“懸空”了,所以垃圾收集器會在后面的垃圾收集階段將白色的E對象收集掉,其他的對象不會收集。
    總結
    這里的三色標記算法并不是在程序內部真正的將對象標記成為黑色、灰色、白色,而是可能用了兩個二進制位來表示,比如00表示黑色、01表示灰色、10表示白色,所以這里的三色標記算法只是為了讓大家更好的理解罷了,希望大家看了我的文章可以有所收獲,也希望大家多多關注我,我們一起學習進步,謝謝大家。

    • 0
      點贊
    • 0
      評論
    • 2
      收藏
    • 一鍵三連
      一鍵三連
    • 掃一掃,分享海報

    ??2020 CSDN 皮膚主題: 1024 設計師:白松林 返回首頁
    實付
    使用余額支付
    點擊重新獲取
    掃碼支付
    錢包余額 0

    抵扣說明:

    1.余額是錢包充值的虛擬貨幣,按照1:1的比例進行支付金額的抵扣。
    2.余額無法直接購買下載,可以購買VIP、C幣套餐、付費專欄及課程。

    余額充值
    多乐彩