成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一個GCRoot不可達的對象,會立刻被垃圾回收嗎?

開發(fā) 前端
java提供了一個finalize方法,可以幫助我們進行資源釋放,類似于C++中的析構(gòu)函數(shù)。這篇文章對其進行一個說明。

[[375323]]

 這個問題是我在刷牛客面經(jīng)的時候遇到的,還特地整理在了我的常規(guī)面試題文檔中,所以這道題主要考察的就是finalize方法的影響。

java提供了一個finalize方法,可以幫助我們進行資源釋放,類似于C++中的析構(gòu)函數(shù)。這篇文章對其進行一個說明。

一、為什么有影響

我們都知道一個對象GCRoot不可達,java虛擬機就認為是垃圾對象,就會進行垃圾回收,但是如果這個對象包含了finalize函數(shù),性質(zhì)就不一樣了。怎么不一樣了呢?

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

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

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

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

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

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

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

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

注意:這里其實就是一道面試題,我在看牛客網(wǎng)上的面經(jīng)時,看到有人被問到過。也就是GCRoot不可達的對象,會立刻被垃圾回收嗎?

我們使用一個案例來分析一波:

二、案例演示

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

  1. public 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.     } 

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

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

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

  1. java.lang.OutOfMemoryError: Java heap space 
  2. Dumping heap to F:/a.dump ... 
  3. finalize被執(zhí)行 
  4. finalize被執(zhí)行 
  5. finalize被執(zhí)行 
  6. finalize被執(zhí)行 
  7. finalize被執(zhí)行 
  8. finalize被執(zhí)行 
  9. finalize被執(zhí)行 
  10. Unable to create F:/a.dump: File exists 
  11. Exception 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) 

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

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

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

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

OK,一些其他的信息就不再展示了。

結(jié)論

一個GCRoot不可達的對象,不會立刻被垃圾回收,首先還會判斷是否包含了finalize方法,如果有那就先執(zhí)行finalize方法,如果這樣的對象比較多,那么這部分對象及時GCRoot不可達,變得沒用了,也會留在內(nèi)存中,影響程序的效率。

本文轉(zhuǎn)載自微信公眾號「愚公要移山」,可以通過以下二維碼關注。轉(zhuǎn)載本文請聯(lián)系愚公要移山公眾號。

 

責任編輯:武曉燕 來源: 愚公要移山
相關推薦

2020-04-09 08:47:38

Java對象線程

2012-12-18 13:57:42

.NetC#

2022-03-21 11:33:11

JVM垃圾回收器垃圾回收算法

2024-05-29 08:46:19

2017-08-04 10:53:30

回收算法JVM垃圾回收器

2022-01-20 10:34:49

JVM垃圾回收算法

2020-03-13 08:00:00

.NET對象清理垃圾回收

2016-12-05 16:33:30

2021-01-04 10:08:07

垃圾回收Java虛擬機

2015-04-21 11:33:37

JavaJava垃圾回收

2019-12-02 16:23:03

Python編程語言“垃圾”回收

2020-07-09 08:26:42

Kubernetes容器開發(fā)

2021-03-03 08:13:57

模式垃圾回收

2021-11-04 17:23:03

Java對象 immutable

2021-03-11 07:26:52

垃圾回收器單線程

2021-11-05 15:23:20

JVM回收算法

2009-12-30 10:14:29

JVM垃圾回收

2022-06-22 09:54:45

JVM垃圾回收Java

2009-07-06 17:34:22

Java垃圾回收

2023-12-25 09:30:41

Java垃圾回收
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久成人精品 | 中文字幕在线视频观看 | 午夜视频一区 | 国产精品久久久久久久岛一牛影视 | 久久久久国产一区二区三区四区 | 亚洲视频一区二区 | 日韩精品久久一区二区三区 | 精品毛片视频 | 欧美专区在线观看 | 欧美精品1区 | 亚洲欧美日韩电影 | 久久久久久国产精品免费免费男同 | 99久久99久久精品国产片果冰 | 国产精彩视频 | 一区二区三区在线免费观看 | av中文天堂| 日韩精品一区二区三区中文在线 | 久久九精品 | 久久综合伊人一区二区三 | 色约约视频 | 中文字幕第一页在线 | 国产日韩欧美 | 亚洲一区二区三区国产 | wwwsihu| 日韩一区二区三区在线视频 | 99re热精品视频 | 最新国产精品精品视频 | 在线观看免费毛片 | 国产一区二区三区不卡av | 久久久国产一区二区三区 | 日本久草| 99热播放| 一a级片| 亚洲一区二区三区在线播放 | 久久久久国色av免费观看性色 | 狠狠色综合网站久久久久久久 | 亚洲h色 | 在线精品一区二区 | 国产精品视频一 | 国产精品国产成人国产三级 | 国产激情视频网 |