2013-06-28 26 views
3

我想知道爲什麼CMS需要兩個階段(以及兩個暫停)的標記:即初始標記和備註。我們可以簡單地做一個標記,然後執行掃描?我想這可能是一個更快的停頓。有人可以幫助解釋第二標記的主要目的是什麼以及我們爲什麼需要它?謝謝!爲什麼JVM CMS(併發標記和掃描)需要兩次GC暫停?

回答

5

這在熱點內存管理白皮書非常漂亮解釋說:

的CMS回收器回收週期與短暫停開始,稱爲初始標誌,標識初始設置活動對象直接到達的來自應用程序代碼。然後,在併發標記階段,收集器將標記所有可從該集合中傳遞到的活動對象。因爲應用程序正在運行並在標記階段發生時更新引用字段,所以並不是所有活動對象都會在併發標記階段結束時進行標記。爲了處理這個問題,應用程序再次停止第二次暫停,稱爲備註,通過重新訪問在併發標記階段修改的任何對象來完成標記。由於備註暫停比初始標記更爲實質,因此多個線程並行運行以提高效率。 在備註階段結束時,堆中的所有活動對象都會被標記,所以後續的併發清除階段將回收所有已標識的垃圾。

+0

謝謝!這就說得通了。我曾經認爲最初的標記會通過識別可傳遞的對象來做更多的事情。 – yuyang

相關問題