垃圾回收的時候,首先須要判斷對象是否存活,判斷對象是否存活的時候,通常都是使用可達性分析,就是尋找引用鏈。若是在尋找從一個節點開始,逐個去尋找引用鏈,則會消耗不少時間,所以hotspot在尋找引用鏈的時候,過程(不敢保證是否就是正確的,只是本身看着周志明的書,本身理解的狀況)以下:安全
- 因爲程序不會任什麼時候候都停下來GC(某些線程正在處理數據,則會產生髒數據),只有到達安全的地方纔能中止下來GC,俗稱安全點。
- 在安全點GC的時候,因爲GC的時候,程序必須停頓掉全部其餘正在執行的線程(stop the world), 停頓的時間長度取決於判斷對象是否存活的時間,當判斷對象是否存活的時候,採用可達性分析,去找到對象的引用鏈,若是從一個節點逐一尋找,時間消費太長。所以hotspot的作法是:當JIT(just in time compile即便編譯器)編譯的時候,經過對象內的偏移量算出引用類型,而後將這些引用類型記錄在一個OopMap數據結構裏,當須要尋找引用鏈的時候,直接掃描這個OopMap便可。
保證程序要GC的時候讓全部線程處於安全點,有兩個方案:數據結構
- 搶先試中斷:讓全部線程中,處於安全點的線程中止,處於非安全點的線程繼續運行,直到到達安全點再中止。(幾乎沒人使用這種中斷方式)
- 主動式中斷:程序設置一箇中斷標誌,各個線程在安全點的時候,去訪問這個標誌是否爲真,是的話中止。