欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

使用finalize方法對(duì)垃圾回收有哪些影響

今天就跟大家聊聊有關(guān)使用finalize方法對(duì)垃圾回收有哪些影響,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的新津縣網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

java提供了一個(gè)finalize方法,可以幫助我們進(jìn)行資源釋放,類似于C++中的析構(gòu)函數(shù)。但是目前普遍的認(rèn)識(shí)是不要使用,為什么呢?就是因?yàn)閷?duì)java虛擬機(jī)的垃圾回收有影響。

一、為什么有影響

我們都知道一個(gè)對(duì)象如果沒有了任何引用,java虛擬機(jī)就認(rèn)為這個(gè)對(duì)象沒什么用了,就會(huì)對(duì)其進(jìn)行垃圾回收,但是如果這個(gè)對(duì)象包含了finalize函數(shù),性質(zhì)就不一樣了。怎么不一樣了呢?

java虛擬機(jī)在進(jìn)行垃圾回收的時(shí)候,一看到這個(gè)對(duì)象類含有finalize函數(shù),就把這個(gè)函數(shù)交給FinalizerThread處理,而包含了這個(gè)finalize的對(duì)象就會(huì)被添加到FinalizerThread的執(zhí)行隊(duì)列,并使用一個(gè)鏈表,把這些包含了finalize的對(duì)象串起來。

使用finalize方法對(duì)垃圾回收有哪些影響

他的影響在于只要finalize沒有執(zhí)行,那么這些對(duì)象就會(huì)一直存在堆區(qū),不過這里只是4個(gè)包含了finalize的對(duì)象,影響不是那么大,如果有一萬個(gè)或者是十萬個(gè)呢?這就影響大了。

finalize的原理其實(shí)很簡單,在這里簡要的梳理一下:

(1)對(duì)象在初始化的過程中會(huì)判斷是否重寫了finalize,方法是判斷兩個(gè)字段標(biāo)志has_finalizer_flag和RegisterFinalizersAtInit。

(2)如果重寫了finalize,那就把當(dāng)前對(duì)象注冊到FinalizerThread的ReferenceQueue隊(duì)列中。注冊之后的對(duì)象就叫做Finalizer。方法是調(diào)用register_finalizer函數(shù)。此時(shí)java虛擬機(jī)一看當(dāng)前有這個(gè)對(duì)象的引用,于是就不進(jìn)行垃圾回收了。

(3)對(duì)象開始被調(diào)用,F(xiàn)inalizerThread線程負(fù)責(zé)從ReferenceQueue隊(duì)列中獲取Finalizer對(duì)象。開始執(zhí)行finalize方法,在執(zhí)行之前,這個(gè)對(duì)象一直在堆中。

(4)對(duì)象執(zhí)行完畢之后,將這個(gè)Finalizer對(duì)象從隊(duì)列中移除,java虛擬機(jī)一看對(duì)象沒有引用了,就進(jìn)行垃圾回收了。

這就是整個(gè)過程。不過在這里我們主要看的是finalize方法對(duì)垃圾回收的影響,其實(shí)就是在第三步,也就是這個(gè)對(duì)象含有finalize,進(jìn)入了隊(duì)列但一直沒有被調(diào)用的這段時(shí)間,會(huì)一直占用內(nèi)存。

我們使用一個(gè)案例來分析一波:

 

二、案例演示

我們創(chuàng)建一個(gè)類

 1public class TestFinalizer {
2    public static class Fdd {
3        //分配1M
4        private byte[] content = new byte[1024*1024];
5        @Override
6        protected void finalize() {
7            System.out.println("finalize被執(zhí)行");
8        }
9    }
10    public static void main(String[] args) {   
11        for (int i = 0; i < 1000; i++) {
12            Fdd fdd = new Fdd(); 
13        }
14    }
15}
 

現(xiàn)在創(chuàng)建了類,我們設(shè)置一下參數(shù)。

1# 最大堆內(nèi)存
2-Xmx5m 
3# 最小堆內(nèi)存
4-Xms5m  
5# 堆內(nèi)存溢出錯(cuò)誤打印
6-XX:+HeapDumpOnOutOfMemoryError 
7# 把堆相關(guān)信息保存在下列路徑
8-XX:HeapDumpPath=F:/a.dump
 

在main方法中,創(chuàng)建了1000個(gè)Fdd對(duì)象,如果不執(zhí)行finalize方法,那么因?yàn)闆]有調(diào)用所以會(huì)進(jìn)行垃圾回收,此時(shí)不斷我們創(chuàng)建多少個(gè),都不會(huì)出現(xiàn)任何問題。但是如果存在finalize方法,就不一樣了。

 1java.lang.OutOfMemoryError: Java heap space
2Dumping heap to F:/a.dump ...
3finalize被執(zhí)行
4finalize被執(zhí)行
5finalize被執(zhí)行
6finalize被執(zhí)行
7finalize被執(zhí)行
8finalize被執(zhí)行
9finalize被執(zhí)行
10Unable to create F:/a.dump: File exists
11Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
12    at com.fdd.chapter2.TestFinalizer$Fdd.<init>(TestFinalizer.java:6)
13    at com.fdd.chapter2.TestFinalizer.main(TestFinalizer.java:14)
 

我們看到每個(gè)對(duì)象都會(huì)執(zhí)行finalize,在執(zhí)行之前的這段時(shí)間一直會(huì)在堆區(qū),執(zhí)行完了就會(huì)被清理,所以你看到這里執(zhí)行了不少于5次的finalize方法。但是對(duì)象一旦超出了我們設(shè)置的5M,就會(huì)出現(xiàn)內(nèi)存溢出。一句話總結(jié)就是出現(xiàn)了對(duì)象堆積。現(xiàn)在使用MAT工具來分析一下。

Mat工具是一個(gè)插件,也可以自己下載一個(gè)。下載完成之后打開我們剛剛生成的a.dump即可。

下面這張圖就是分析的結(jié)果:

使用finalize方法對(duì)垃圾回收有哪些影響

a這塊的內(nèi)容就是Finalizer,也就是我們的Fdd對(duì)象,b包含的比較多,亂七八糟的剩余信息。當(dāng)然你也可以查看一些其他的信息。都在MAT工具上。還有一些正在執(zhí)行的finalizer和準(zhǔn)備執(zhí)行的。

看完上述內(nèi)容,你們對(duì)使用finalize方法對(duì)垃圾回收有哪些影響有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

當(dāng)前題目:使用finalize方法對(duì)垃圾回收有哪些影響
分享路徑:http://chinadenli.net/article28/ppdecp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)ChatGPT網(wǎng)站設(shè)計(jì)公司移動(dòng)網(wǎng)站建設(shè)外貿(mào)建站域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司