1.1 枚舉根節(jié)點(diǎn)
在HotSpot的實(shí)現(xiàn)中,利用OopMap數(shù)據(jù)結(jié)構(gòu)來(lái)記錄對(duì)象內(nèi)什么偏移量是什么類型的數(shù)據(jù)之類的蚕愤,JIT編譯的時(shí)候也會(huì)記錄览露。GC掃描的時(shí)候去掃描OopMap就可以了,而無(wú)需一個(gè)不漏地檢查完所有執(zhí)行上下文和全局的引用位置讨便。
1.2 安全點(diǎn)
安全點(diǎn):
大多數(shù)垃圾收集器進(jìn)行g(shù)c的時(shí)候甲捏,需要進(jìn)行stop the world 演熟,停止jvm所有的線程,只有所有線程都到達(dá)這個(gè)點(diǎn)的時(shí)候司顿,才可以進(jìn)行g(shù)c芒粹,這個(gè)點(diǎn)就是安全點(diǎn)兄纺。
對(duì)于gc收集器來(lái)講,如何在gc時(shí)候快速到達(dá)安全點(diǎn)是一個(gè)關(guān)鍵點(diǎn)化漆,有以下兩種方式(現(xiàn)在基本都用的是主動(dòng)式中斷):
- 搶先式中斷:無(wú)需線程配合估脆,gc時(shí),把所有線程全部中斷获三,如果有線程中斷的地方不在安全點(diǎn)就恢復(fù)該線程旁蔼,讓他跑到安全點(diǎn)上锨苏。
- 主動(dòng)式中斷:gc需要中斷線程的時(shí)候疙教,不直接對(duì)線程操作,簡(jiǎn)單的設(shè)置一個(gè)標(biāo)志伞租,各線程輪詢這個(gè)標(biāo)志贞谓,發(fā)現(xiàn)中斷標(biāo)志為真的時(shí)候,就自己中斷掛起葵诈,輪詢標(biāo)志的地方和安全點(diǎn)是重合的裸弦,另外再加上創(chuàng)建對(duì)象需要分配內(nèi)存的地方。
1.3 安全區(qū)域
在線程sleep或者blocked的時(shí)候是沒辦法主動(dòng)輪詢中斷標(biāo)志的作喘,也就無(wú)法響應(yīng)gc的中斷請(qǐng)求理疙,這種情況下,就誕生了安全域泞坦。
安全域:在一段代碼里窖贤,引用關(guān)系不會(huì)變,在這段代碼的任何地方gc都是安全的贰锁。
在線程執(zhí)行到安全域的時(shí)候就標(biāo)識(shí)自己已經(jīng)進(jìn)入安全域赃梧,然后jvm要gc的時(shí)候就不用管這些進(jìn)入安全域的線程了,線程離開安全域的時(shí)候豌熄,會(huì)檢測(cè)系統(tǒng)是否完成了GC授嘀。