判斷對(duì)象存活狀態(tài)
1.引用計(jì)數(shù)法
當(dāng)有一個(gè)地方引用A對(duì)象,則A對(duì)象計(jì)數(shù)器+1,當(dāng)引用失效時(shí),則A對(duì)象計(jì)數(shù)器-1。
優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單,判斷效率高。
缺點(diǎn):很難解決循環(huán)引用。
2.可達(dá)性分析算法
GCRoots,遍歷,不在樹(shù)內(nèi)的可回收。
可以作為GCRoots的有:
虛擬機(jī)棧(本地變量表local variable)中引用的對(duì)象
方法區(qū)中類(lèi)靜態(tài)引用的對(duì)象
方法區(qū)中常量引用的對(duì)象
本地方法棧中NATIVE方法引用的對(duì)象
引用狀態(tài)
強(qiáng)引用>軟引用>弱引用>虛引用
對(duì)象是否應(yīng)該進(jìn)行回收判斷策略

回收方法區(qū)
使用場(chǎng)景:大量使用反射、動(dòng)態(tài)代理、GCLib等byteCode框架;動(dòng)態(tài)生成JSP及OSGi頻繁自定義ClassLoader
1.該類(lèi)所有實(shí)例已被回收,及堆中不存在該類(lèi)的任何實(shí)例。
2.加載該類(lèi)的ClassLoader已被回收
3.該類(lèi)對(duì)應(yīng)的java.lang.class對(duì)象沒(méi)有被任何地方引用,無(wú)法在任何地方通過(guò)反射訪問(wèn)該類(lèi)方法
垃圾收集方法
1.標(biāo)記-清除算法
不足:標(biāo)記及清除,效率不高;易造成空間碎片化。

2.標(biāo)記-復(fù)制算法
新生代中的對(duì)象朝生夕死,所以分為eden:survivor1:survivor2 8:1:1,當(dāng)survivor2空間不夠時(shí),老年代進(jìn)行分配擔(dān)保

3.標(biāo)記-整理算法
用于老年代
4.分代搜集算法
新生代:標(biāo)記-復(fù)制算法(少量存活)
老年代:標(biāo)記-清除算法、標(biāo)記-整理算法(大量存活)
5.HOTSPOT算法
枚舉根節(jié)點(diǎn),OopMap里記錄了內(nèi)存[偏移量]=數(shù)據(jù)類(lèi)型(記錄了棧上本地變量到堆上對(duì)象的引用關(guān)系,即記錄了棧上代表引用的所有位置)
安全點(diǎn),記錄OopMap的點(diǎn),只有走到安全點(diǎn)時(shí),才能進(jìn)行g(shù)c。分為搶先式中斷及主動(dòng)式中斷。
安全區(qū)域(解決線程sleep、blocked狀態(tài)時(shí)的gc),進(jìn)入安全區(qū)域后,標(biāo)記,離開(kāi)安全區(qū)域時(shí),檢查是否完成gc過(guò)程