JVM中判定對(duì)象需要回收的方法
引用計(jì)數(shù)法
每個(gè)對(duì)象上都有一個(gè)引用計(jì)數(shù),對(duì)象每被引用一次,引用計(jì)數(shù)器就+1,對(duì)象引用被釋放,引用計(jì)數(shù)器-1,直到對(duì)象的引用計(jì)數(shù)為0,對(duì)象就標(biāo)識(shí)可以回收
這個(gè)可以用數(shù)據(jù)算法中的圖形表示,對(duì)象A-對(duì)象B-對(duì)象C 都有引用,所以不會(huì)被回收,對(duì)象B由于沒有被引用,沒有路徑可以達(dá)到對(duì)象B,對(duì)象B的引用計(jì)數(shù)就就是0,對(duì)象B就會(huì)被回收。
但是這個(gè)算法有明顯的缺陷,對(duì)于循環(huán)引用的情況下,循環(huán)引用的對(duì)象就不會(huì)被回收。例如下圖:對(duì)象A,對(duì)象B 循環(huán)引用,沒有其他的對(duì)象引用A和B,則A和B 都不會(huì)被回收。
root搜索算法
這種算法目前定義了幾個(gè)root,也就是這幾個(gè)對(duì)象是jvm虛擬機(jī)不會(huì)被回收的對(duì)象,所以這些對(duì)象引用的對(duì)象都是在使用中的對(duì)象,這些對(duì)象未使用的對(duì)象就是即將要被回收的對(duì)象。簡(jiǎn)單就是說:如果對(duì)象能夠達(dá)到root,就不會(huì)被回收,如果對(duì)象不能夠達(dá)到root,就會(huì)被回收。
被啟動(dòng)類(bootstrap加載器)加載的類和創(chuàng)建的對(duì)象
jvm運(yùn)行時(shí)方法區(qū)類靜態(tài)變量(static)引用的對(duì)象
jvm運(yùn)行時(shí)方法去常量池引用的對(duì)象
jvm當(dāng)前運(yùn)行線程中的虛擬機(jī)棧變量表引用的對(duì)象
本地方法棧中(jni)引用的對(duì)象
jvm在確定是否回收的對(duì)象的時(shí)候采用的是root搜索算法來實(shí)現(xiàn)。
補(bǔ)充:jvm判斷對(duì)象的回收
可達(dá)性分析算法
可達(dá)性分析算法:通過一系列“GC Roots”的根對(duì)象作為起始節(jié)點(diǎn)集,根據(jù)引用關(guān)系向下搜索,若某個(gè)對(duì)象到根對(duì)象無任何引用鏈相連,則此對(duì)象不可達(dá)。
但是可達(dá)性分析后為不可達(dá)的對(duì)象不是一定要回收,會(huì)經(jīng)歷一個(gè)二次標(biāo)記過程。
二次標(biāo)記
1.如果對(duì)象在可達(dá)性分析后結(jié)果為不可達(dá),則會(huì)被第一次標(biāo)記。接著進(jìn)行篩選,篩選條件為是否執(zhí)行finalize()方法。
- 若該對(duì)象未覆蓋finalize()方法,或finalize()已被調(diào)用過一次,則不需要執(zhí)行finalize()方法。那么此對(duì)象判定為需要回收。
(對(duì)象的 finalize()方法只會(huì)被系統(tǒng)調(diào)用一次,下次回收該對(duì)象時(shí), finalize()不會(huì)再執(zhí)行)
- 若該對(duì)象覆蓋了finalize()方法,且finalize()方法未被調(diào)用過,則需要執(zhí)行finalize()方法。
2.若該對(duì)象需要執(zhí)行finalize()方法,則該對(duì)象會(huì)被放置在一個(gè)F-Queue的隊(duì)列中,再由一個(gè)finalizer線程執(zhí)行這些對(duì)象的finalize()方法。
3.接著收集器會(huì)堆F-Queue隊(duì)列的對(duì)象進(jìn)行二次標(biāo)記,若對(duì)象在finalize() 方法中未能逃脫,那么該對(duì)象會(huì)被二次標(biāo)記,二次標(biāo)記的對(duì)象判定為需要回收;
(對(duì)象可以在 finalize()方法中,將自己和引用鏈上的對(duì)象建立引用關(guān)系,這樣在第二次標(biāo)記時(shí),收集器會(huì)將其移出回收對(duì)象的集合,以此達(dá)到逃脫)
到此這篇關(guān)于jvm中如何判定對(duì)象需要回收的文章就介紹到這了,更多相關(guān)jvm判斷對(duì)象回收內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Spring或SpringBoot開啟事務(wù)以后無法返回自增主鍵的問題
這篇文章主要介紹了解決Spring或SpringBoot開啟事務(wù)以后無法返回自增主鍵的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot JPA實(shí)現(xiàn)增刪改查、分頁(yè)、排序、事務(wù)操作等功能示例
本篇文章主要介紹了SpringBoot JPA實(shí)現(xiàn)增刪改查、分頁(yè)、排序、事務(wù)操作等功能示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03Java中Map實(shí)現(xiàn)線程安全的3種方式
本文主要介紹了Java中Map實(shí)現(xiàn)線程安全的3種方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Java中統(tǒng)計(jì)字符個(gè)數(shù)以及反序非相同字符的方法詳解
本篇文章是對(duì)Java中統(tǒng)計(jì)字符個(gè)數(shù)以及反序非相同字符的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05SpringMvc使用GoogleKaptcha生成驗(yàn)證碼
這篇文章主要為大家詳細(xì)介紹了SpringMvc項(xiàng)目中使用GoogleKaptcha 生成驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09Java登錄功能實(shí)現(xiàn)token生成與驗(yàn)證
這篇文章介紹了Java登錄功能實(shí)現(xiàn)token生成與驗(yàn)證,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12