溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JVM中判定對象需要回收的方法是什么

發(fā)布時(shí)間:2022-04-20 09:07:11 來源:億速云 閱讀:167 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“JVM中判定對象需要回收的方法是什么”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“JVM中判定對象需要回收的方法是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

引用計(jì)數(shù)法

每個(gè)對象上都有一個(gè)引用計(jì)數(shù),對象每被引用一次,引用計(jì)數(shù)器就+1,對象引用被釋放,引用計(jì)數(shù)器-1,直到對象的引用計(jì)數(shù)為0,對象就標(biāo)識可以回收

這個(gè)可以用數(shù)據(jù)算法中的圖形表示,對象A-對象B-對象C 都有引用,所以不會被回收,對象B由于沒有被引用,沒有路徑可以達(dá)到對象B,對象B的引用計(jì)數(shù)就就是0,對象B就會被回收。

JVM中判定對象需要回收的方法是什么

但是這個(gè)算法有明顯的缺陷,對于循環(huán)引用的情況下,循環(huán)引用的對象就不會被回收。例如下圖:對象A,對象B 循環(huán)引用,沒有其他的對象引用A和B,則A和B 都不會被回收。

JVM中判定對象需要回收的方法是什么

root搜索算法

這種算法目前定義了幾個(gè)root,也就是這幾個(gè)對象是jvm虛擬機(jī)不會被回收的對象,所以這些對象引用的對象都是在使用中的對象,這些對象未使用的對象就是即將要被回收的對象。簡單就是說:如果對象能夠達(dá)到root,就不會被回收,如果對象不能夠達(dá)到root,就會被回收。

JVM中判定對象需要回收的方法是什么

被啟動(dòng)類(bootstrap加載器)加載的類和創(chuàng)建的對象
jvm運(yùn)行時(shí)方法區(qū)類靜態(tài)變量(static)引用的對象
jvm運(yùn)行時(shí)方法去常量池引用的對象
jvm當(dāng)前運(yùn)行線程中的虛擬機(jī)棧變量表引用的對象
本地方法棧中(jni)引用的對象

JVM中判定對象需要回收的方法是什么

jvm在確定是否回收的對象的時(shí)候采用的是root搜索算法來實(shí)現(xiàn)。

補(bǔ)充:jvm判斷對象的回收

可達(dá)性分析算法

可達(dá)性分析算法:通過一系列“GC Roots”的根對象作為起始節(jié)點(diǎn)集,根據(jù)引用關(guān)系向下搜索,若某個(gè)對象到根對象無任何引用鏈相連,則此對象不可達(dá)。

但是可達(dá)性分析后為不可達(dá)的對象不是一定要回收,會經(jīng)歷一個(gè)二次標(biāo)記過程。

二次標(biāo)記

1.如果對象在可達(dá)性分析后結(jié)果為不可達(dá),則會被第一次標(biāo)記。接著進(jìn)行篩選,篩選條件為是否執(zhí)行finalize()方法。

  • 若該對象未覆蓋finalize()方法,或finalize()已被調(diào)用過一次,則不需要執(zhí)行finalize()方法。那么此對象判定為需要回收。

(對象的 finalize()方法只會被系統(tǒng)調(diào)用一次,下次回收該對象時(shí), finalize()不會再執(zhí)行)

  • 若該對象覆蓋了finalize()方法,且finalize()方法未被調(diào)用過,則需要執(zhí)行finalize()方法。

2.若該對象需要執(zhí)行finalize()方法,則該對象會被放置在一個(gè)F-Queue的隊(duì)列中,再由一個(gè)finalizer線程執(zhí)行這些對象的finalize()方法。

3.接著收集器會堆F-Queue隊(duì)列的對象進(jìn)行二次標(biāo)記,若對象在finalize() 方法中未能逃脫,那么該對象會被二次標(biāo)記,二次標(biāo)記的對象判定為需要回收;

(對象可以在 finalize()方法中,將自己和引用鏈上的對象建立引用關(guān)系,這樣在第二次標(biāo)記時(shí),收集器會將其移出回收對象的集合,以此達(dá)到逃脫)

讀到這里,這篇“JVM中判定對象需要回收的方法是什么”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

jvm
AI