java 对象被回收的例子_jvm(4)---垃圾回收(哪些对象可以被回收)
1.java堆中幾乎放著所有對(duì)象的實(shí)例,那么什么樣子的對(duì)象才是可以被回收的呢?
1.1.引用計(jì)數(shù)法:
給對(duì)象添加一個(gè)引用計(jì)數(shù)器,當(dāng)有地方引用的時(shí)候,計(jì)數(shù)器就+1,引用失效就-1;任何時(shí)候當(dāng)計(jì)數(shù)器為0,那么這個(gè)對(duì)象就是可以被回收的。該方法實(shí)現(xiàn)簡(jiǎn)單,效率也高,但是并沒(méi)有被主流的虛擬機(jī)采用,因?yàn)楹茈y解決對(duì)象互相循環(huán)引用問(wèn)題。
1.2.可達(dá)性分析算法
這個(gè)的基本思想就是通過(guò)一系列的“GC Roots”作為對(duì)象的起點(diǎn),從這些節(jié)點(diǎn)開(kāi)始向下搜索,節(jié)點(diǎn)所走過(guò)的路徑稱為引用鏈,當(dāng)一個(gè)對(duì)象到 GC Roots 沒(méi)有任何引用鏈相連的話,則證明此對(duì)象是不可用的。
那些可以作為GC Roots節(jié)點(diǎn)呢? 一般來(lái)說(shuō)類加載器、Thread、虛擬機(jī)棧的本地變量表、static成員、常量引用、本地方法棧的變量等等。
1.3 finalize()方法(只會(huì)被調(diào)用一次)
即使在可達(dá)性分析算法中不可達(dá)的對(duì)象,也并非是“非死不可”的,這時(shí)候它們暫時(shí)處于“緩刑”階段,要真正宣告一個(gè)對(duì)象死亡,至少要經(jīng)歷再次標(biāo)記過(guò)程。
標(biāo)記的前提是對(duì)象在進(jìn)行可達(dá)性分析后發(fā)現(xiàn)沒(méi)有與GC Roots相連接的引用鏈。
1.3.1.第一次標(biāo)記并進(jìn)行一次篩選。
篩選的條件是此對(duì)象是否有必要執(zhí)行finalize()方法。
當(dāng)對(duì)象沒(méi)有覆蓋finalize方法,或者finzlize方法已經(jīng)被虛擬機(jī)調(diào)用過(guò),虛擬機(jī)將這兩種情況都視為“沒(méi)有必要執(zhí)行”,對(duì)象被回收。
1.3.2.第二次標(biāo)記
如果這個(gè)對(duì)象被判定為有必要執(zhí)行finalize()方法,那么這個(gè)對(duì)象將會(huì)被放置在一個(gè)名為:F-Queue的隊(duì)列之中,并在稍后由一條虛擬機(jī)自動(dòng)建立的、低優(yōu)先級(jí)的Finalizer線程去執(zhí)行。這里所謂的“執(zhí)行”是指虛擬機(jī)會(huì)觸發(fā)這個(gè)方法,但并不承諾會(huì)等待它運(yùn)行結(jié)束。這樣做的原因是,如果一個(gè)對(duì)象finalize()方法中執(zhí)行緩慢,或者發(fā)生死循環(huán)(更極端的情況),將很可能會(huì)導(dǎo)致F-Queue隊(duì)列中的其他對(duì)象永久處于等待狀態(tài),甚至導(dǎo)致整個(gè)內(nèi)存回收系統(tǒng)崩潰。
finalize()方法是對(duì)象脫逃死亡命運(yùn)的最后一次機(jī)會(huì),稍后GC將對(duì)F-Queue中的對(duì)象進(jìn)行第二次小規(guī)模標(biāo)記,如果對(duì)象要在finalize()中成功拯救自己----只要重新與引用鏈上的任何的一個(gè)對(duì)象建立關(guān)聯(lián)即可,譬如把自己賦值給某個(gè)類變量或?qū)ο蟮某蓡T變量,那在第二次標(biāo)記時(shí)它將移除出“即將回收”的集合。如果對(duì)象這時(shí)候還沒(méi)逃脫,那基本上它就真的被回收了。
1.4如何判斷一個(gè)常量是廢棄常量
假如在常量池中存在字符串 \"abc\",如果當(dāng)前沒(méi)有任何String對(duì)象引用該字符串常量的話,就說(shuō)明常量 \"abc\" 就是廢棄常量,如果這時(shí)發(fā)生內(nèi)存回收的話而且有必要的話,\"abc\" 就會(huì)被系統(tǒng)清理出常量池。
1.5如何判斷一個(gè)類是無(wú)用的類
1.該類所有的實(shí)例都已經(jīng)被回收,也就是 Java 堆中不存在該類的任何實(shí)例。
2.加載該類的 ClassLoader 已經(jīng)被回收。
3.該類對(duì)應(yīng)的 java.lang.Class 對(duì)象沒(méi)有在任何地方被引用,無(wú)法在任何地方通過(guò)反射訪問(wèn)該類的方法。
但是并不是和對(duì)象一樣不使用了就會(huì)必然被回收。
總結(jié)
以上是生活随笔為你收集整理的java 对象被回收的例子_jvm(4)---垃圾回收(哪些对象可以被回收)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java 迪杰斯特拉_Java 实现Di
- 下一篇: java简单介绍_java 简单介绍