【26期】如何判斷一個對象是否存活?(或者GC對象的判定方法)?
閱讀本文大概需要 3?分鐘。
來自:www.jianshu.com/p/09a574dcd5df
引用計數(shù)算法
可達性分析算法
引用計數(shù)算法(Reference Counting)
public?class?ReferenceCountingGC?{
????public?Object?instance?=?null;
????public?static?void?testGC()?{
????????ReferenceCountingGC?objA?=?new?ReferenceCountingGC();
????????ReferenceCountingGC?objB?=?new?ReferenceCountingGC();
????????objA.instance?=?objB;
????????objB.instance?=?objA;
????????objA?=?null;
????????objB?=?null;
????????//?假設(shè)在這行發(fā)生GC, objA 和 objB是否能被回收?
????????System.gc();
????}
}

可達性分析算法(Reachability Analysis)
生存還是死亡
??
如果這個對象被判定為有必要執(zhí)行finalize()方法,那么這個對象將會放置在一個叫做F-Queue的隊列之中。并在稍后由一個虛擬機自動建立的,低優(yōu)先級的Finalizer線程去執(zhí)行它。這里所謂“執(zhí)行”是指虛擬機會觸發(fā)這個方法,但并不承諾會等待它運行結(jié)束,這樣做的原因是,如果有一個對象在finalize()方法中執(zhí)行緩慢,或者發(fā)生死循環(huán),將可能會導(dǎo)致F-Queue隊列中其他對象永久處于等待,甚至導(dǎo)致整個內(nèi)存回收系統(tǒng)崩潰。
??
finalize()方法是對象逃脫死亡命運的最后一次機會,稍后GC將對F-Queue中的對象進行第二次小規(guī)模的標記,如果對象這個時候,未被重新引用,那它基本上就真的被回收了。
回收方法區(qū)
該類的所有實例都已經(jīng)被回收
加載該類的ClassLoader已經(jīng)被回收
該類對應(yīng)的java.lang.Class對象已經(jīng)沒有任何地方被引用,無法在任何地方通過反射訪問該類的方法。
推薦閱讀:
【24期】請你談?wù)剢卫J降膬?yōu)缺點,注意事項,使用場景
【23期】請你談?wù)勱P(guān)于IO同步、異步、阻塞、非阻塞的區(qū)別
微信掃描二維碼,關(guān)注我的公眾號
朕已閱?
評論
圖片
表情

