欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java詳解對(duì)象終止方法finalize()的用法

 更新時(shí)間:2022年05月10日 09:45:25   作者:羨羨ˇ  
在前面的 jvm 中, 需要補(bǔ)充幾個(gè)部分的內(nèi)容, 接著來(lái)看 finalize() 機(jī)制, 它可以使接近死亡的對(duì)象復(fù)活, 下來(lái)我們來(lái)看是怎么一回事

finalize()方法機(jī)制

Java 語(yǔ)言提供了對(duì)象終止(finalization)機(jī)制來(lái)允許開(kāi)發(fā)人員提供對(duì)象被銷毀之前的自定義處理邏輯。

當(dāng)GC去回收垃圾時(shí), 總會(huì)在即將回收之前調(diào)用這個(gè)對(duì)象的 finalize()方法 , 一個(gè)對(duì)象finalize()方法只會(huì)被調(diào)用一次

finalize()方法可以被重寫,通常在這個(gè)方法中進(jìn)行一些資源釋放和清理的工作,比如關(guān)閉文件、套接字和數(shù)據(jù)庫(kù)連接等。

我們一般最好不要主動(dòng)去調(diào)用對(duì)象的finalize()方法, 理由有以下三點(diǎn) :

1.在 finalize()時(shí)可能會(huì)導(dǎo)致對(duì)象復(fù)活。

2.finalize()方法的執(zhí)行時(shí)間是沒(méi)有保障的,它完全由 GC 線程決定,極端情況下,若不發(fā)生 GC,則 finalize()方法將沒(méi)有執(zhí)行機(jī)會(huì)。

3.一個(gè)糟糕的 finalize()會(huì)嚴(yán)重影響 GC 的性能。比如 finalize 是個(gè)死循環(huán)。

為什么會(huì)有這種機(jī)制呢 ?

我們先來(lái)了解 jvm 為對(duì)象定義的三種狀態(tài)

第一次被 jvm 標(biāo)為垃圾的對(duì)象此時(shí)處于"緩刑"階段, 也就是說(shuō)它此時(shí)并不是非死不可的

可觸及的:從根節(jié)點(diǎn)開(kāi)始,可以到達(dá)這個(gè)對(duì)象。

可復(fù)活的:對(duì)象的所有引用都被釋放,但是對(duì)象有可能在 finalize()中復(fù)活。

不可觸及的:對(duì)象的 finalize()被調(diào)用,并且沒(méi)有復(fù)活,那么就會(huì)進(jìn)入不可觸及狀態(tài)。不可觸及的對(duì)象不可能被復(fù)活,因?yàn)?finalize()只會(huì)被調(diào)用一次。

以上 3 種狀態(tài)中,是由于 finalize()方法的存在,進(jìn)行的區(qū)分。只有在對(duì)象不可觸及時(shí)才可以被回收

可觸及的, 意思就是說(shuō), 對(duì)象此時(shí)存在引用鏈, 是存活的, 可復(fù)活的意思是說(shuō), 此對(duì)象雖然已經(jīng)被GC標(biāo)為了垃圾, 但是此時(shí)未調(diào)用 finalize() 方法, 這個(gè)對(duì)象是有可能在finalize()中復(fù)活的. 不可觸及的就是說(shuō), 此時(shí)finalize()方法已經(jīng)被調(diào)用過(guò)了(沒(méi)有復(fù)活), 這個(gè)對(duì)象最終的命運(yùn)已經(jīng)是非死不可了, 只能靜等GC去回收它

那么具體的過(guò)程是怎樣的呢?

判定一個(gè)對(duì)象 objA 是否可回收,至少要經(jīng)歷兩次標(biāo)記過(guò)程:

1.如果對(duì)象 objA 到 GC Roots 沒(méi)有引用鏈,則進(jìn)行第一次標(biāo)記。

2.進(jìn)行篩選,判斷此對(duì)象是否有必要執(zhí)行 finalize()方法

如果對(duì)象 objA 沒(méi)有重寫 finalize()方法,或者 finalize()方法已經(jīng)被虛擬機(jī)調(diào)用過(guò),則虛擬機(jī)視為“沒(méi)有必要執(zhí)行”,objA 被判定為不可觸及的。

如果對(duì)象 objA 重寫了 finalize()方法,且還未執(zhí)行過(guò),那么 objA 會(huì)被插入到 F-Queue 隊(duì)列中,由一個(gè)虛擬機(jī)自動(dòng)創(chuàng)建的、低優(yōu)先級(jí)的 Finalizer 線程觸發(fā)其 finalize()方法執(zhí)行。finalize()方法是對(duì)象逃脫死亡的最后機(jī)會(huì),稍后 GC 會(huì)對(duì) F-Queue 隊(duì)列中的對(duì)象進(jìn)行第二次標(biāo)記。如果 objA 在 finalize()方法中與引用鏈上的任何一個(gè)對(duì)象建立了聯(lián)系,那么在第二次標(biāo)記時(shí),objA 會(huì)被移出“即將回收”集合。之后,對(duì)象會(huì)再次出現(xiàn)沒(méi)有引用存在的情況. 在這個(gè)情況下,finalize()方法不會(huì)被再次調(diào)用,對(duì)象會(huì)直接變成不可觸及的狀態(tài),也就是說(shuō),一個(gè)對(duì)象的 finalize()方法只會(huì)被調(diào)用一次。

接著我們用代碼演示對(duì)象的復(fù)活

public class CanReliveObj {
	public static CanReliveObj obj;//類變量,屬于 GC Root
	//此方法只能被調(diào)用一次
	 @Override
	protected void finalize() throws Throwable {
		super.finalize();
		System.out.println("調(diào)用當(dāng)前類重寫的finalize()方法");
		obj = this;//當(dāng)前待回收的對(duì)象在finalize()方法中與引用鏈上的一個(gè)對(duì)象obj建立了聯(lián)系
	}
	public static void main(String[] args) {
		try {
			obj = new CanReliveObj();
			// 對(duì)象第一次成功拯救自己
			obj = null;
			System.gc();//調(diào)用垃圾回收器
			System.out.println("第1次 gc");
			// 因?yàn)镕inalizer線程優(yōu)先級(jí)很低,暫停2秒,以等待它
			Thread.sleep(2000);
			if (obj == null) {
				System.out.println("obj is dead");
			} else {
				System.out.println("obj is still alive");
			}
			System.out.println("第2次 gc");
			// 下面這段代碼與上面的完全相同,但是這次自救卻失敗了
			obj = null;
			System.gc();
			// 因?yàn)镕inalizer線程優(yōu)先級(jí)很低,暫停2秒,以等待它
			Thread.sleep(2000);
			if (obj == null) {
				System.out.println("obj is dead");
			} else {
				System.out.println("obj is still alive");
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

執(zhí)行結(jié)果 :

先將引用指向 null , 這時(shí)第一次GC , 我們重寫了finalize()方法, 致使對(duì)象在第一次垃圾回收時(shí)成功自救, 第二次再將引用指向null , 因?yàn)閒inalize() 方法只會(huì)被執(zhí)行一次, 這時(shí)對(duì)象只能等待死亡

到此這篇關(guān)于Java詳解對(duì)象終止方法finalize()的用法的文章就介紹到這了,更多相關(guān)Java finalize()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot中整合Ehcache實(shí)現(xiàn)熱點(diǎn)數(shù)據(jù)緩存的詳細(xì)過(guò)程

    SpringBoot中整合Ehcache實(shí)現(xiàn)熱點(diǎn)數(shù)據(jù)緩存的詳細(xì)過(guò)程

    這篇文章主要介紹了SpringBoot中整合Ehcache實(shí)現(xiàn)熱點(diǎn)數(shù)據(jù)緩存,SpringBoot 中使用 Ehcache 比較簡(jiǎn)單,只需要簡(jiǎn)單配置,說(shuō)白了還是 Spring Cache 的用法,合理使用緩存機(jī)制,可以很好地提高項(xiàng)目的響應(yīng)速度,需要的朋友可以參考下
    2023-04-04
  • Java集合中的鏈表與結(jié)構(gòu)詳解

    Java集合中的鏈表與結(jié)構(gòu)詳解

    鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序的通過(guò)鏈表中的引用鏈接次序?qū)崿F(xiàn),文章對(duì)比ArrayList與LinkedList的結(jié)構(gòu)差異,詳細(xì)講解了鏈表實(shí)現(xiàn)方法及常見(jiàn)面試題如反轉(zhuǎn)、中間節(jié)點(diǎn)查找等,感興趣的朋友跟隨小編一起看看吧
    2025-08-08
  • APT?注解處理器實(shí)現(xiàn)?Lombok?常用注解功能詳解

    APT?注解處理器實(shí)現(xiàn)?Lombok?常用注解功能詳解

    這篇文章主要為大家介紹了使用APT?注解處理器實(shí)現(xiàn)?Lombok?常用注解功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • JavaEE開(kāi)發(fā)之SpringMVC中的自定義消息轉(zhuǎn)換器與文件上傳

    JavaEE開(kāi)發(fā)之SpringMVC中的自定義消息轉(zhuǎn)換器與文件上傳

    本篇文章主要介紹了SpringMVC的相關(guān)知識(shí)。同時(shí)也會(huì)介紹到j(luò)s、css這些靜態(tài)文件的加載配置,以及服務(wù)器推送的兩種實(shí)現(xiàn)方式并且給出了兩者的區(qū)別。下面跟著小編一起來(lái)看下吧
    2017-04-04
  • IDEA2023版本創(chuàng)建Spring項(xiàng)目只能勾選17和21卻無(wú)法使用Java8的完美解決方案

    IDEA2023版本創(chuàng)建Spring項(xiàng)目只能勾選17和21卻無(wú)法使用Java8的完美解決方案

    想創(chuàng)建一個(gè)springboot的項(xiàng)目,本地安裝的是1.8,但是在使用Spring Initializr創(chuàng)建項(xiàng)目時(shí),發(fā)現(xiàn)版本只有17和21,這篇文章主要介紹了IDEA2023版本創(chuàng)建Sping項(xiàng)目只能勾選17和21,卻無(wú)法使用Java8的解決方法,需要的朋友可以參考下
    2023-12-12
  • Mybatisplus如何存儲(chǔ)List、Map

    Mybatisplus如何存儲(chǔ)List、Map

    這篇文章主要介紹了Mybatisplus如何存儲(chǔ)List、Map問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 詳解RocketMQ 消費(fèi)端如何監(jiān)聽(tīng)消息

    詳解RocketMQ 消費(fèi)端如何監(jiān)聽(tīng)消息

    這篇文章主要為大家介紹了RocketMQ 消費(fèi)端如何監(jiān)聽(tīng)消息示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • java多線程學(xué)習(xí)之死鎖的模擬和避免(實(shí)例講解)

    java多線程學(xué)習(xí)之死鎖的模擬和避免(實(shí)例講解)

    下面小編就為大家?guī)?lái)一篇java多線程學(xué)習(xí)之死鎖的模擬和避免(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • 如何基于Springboot完成新增員工功能并設(shè)置全局異常處理器

    如何基于Springboot完成新增員工功能并設(shè)置全局異常處理器

    最近工作中遇到了做一個(gè)管理員工信息的功能,下面這篇文章主要給大家介紹了關(guān)于如何基于Springboot完成新增員工功能并設(shè)置全局異常處理器的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • Java面試題沖刺第二十六天--實(shí)戰(zhàn)編程

    Java面試題沖刺第二十六天--實(shí)戰(zhàn)編程

    這篇文章主要為大家分享了最有價(jià)值的三道java實(shí)戰(zhàn)面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評(píng)論