三色標記算法在並發情況下的漏標問題分析【純理論】


還是延着上一次【https://www.cnblogs.com/webor2006/p/11147545.html】的理論繼續前行。。上一次學到這了:

下面來看一下三色標記算法的整個過程:

  • 根對象被置為黑色,子對象被置為灰色。如下圖:

    其中可以看到灰色對象是已經被掃描過了,但是灰色對象里面所引用的子對象還未被掃描,所以可以看到灰色對象指向了未被掃描過的白色對象。

  • 繼續由灰色遍歷,將已掃描了子對象的對象置為黑色,如下:

    可以看到由於灰色里面的子對象已經被掃描過了,所以原灰色對象就變成了黑色了,而它所引用的白色對象由於被掃描到了,所以白色變成了灰色了。

  • 遍歷了所有可達的對象后,所有可達的對象都變成了黑色。不可達的對象既為白色,需要被清理:

    其中:

    因為這三個對象被掃描完之后就會由白色變成灰色,然后由於這三個對象里面沒有任何其它子對象,所以就由灰度變為了黑色了。

  • 但是如果在標記過程中,應用程序也在運行,那么對象的指針就有可能改變。這樣的話,我們就會遇到一個問題:對象丟失問題。那問題是如何產生的呢,下面來說一下。
  • 當垃圾收集器掃描到下面情況時:
  • 由於在GC掃描時應用程序線程也在同步執行,這時候應用程序執行了以下操作:
    A.c = C
    B.c = null

  • 這樣, 對象的狀態圖變成如下情形:

  • 這時候垃圾收集器再標記掃描的時候就會變成下圖這樣:
  • 由於A變成了黑色,垃圾收信器是永遠不會再掃描它了,因為垃圾回收器認為A里面的所有子對象都已經掃描完了,而問題就來了,此時C是白色,被認為是垃圾需要清理掉,顯示這是不合理的,明明C是一個正常可用的對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM