这篇文章来自网友,但是我忘记原文章是在哪里的了,但还是把这篇文章贴出来吧

一个对象是否被回收并不是仅仅靠当前对象是否被引用这么简单粗暴的方法去判断。

JVM中判断是否回收一个对象使用的是可达性分析算法,GC ROOT不可到达的节点都将会被标记上,一个对象如果被标记了两次就会被回收掉。至于这个可达性分析算法你可以自行百度一下,原理是很简单的。

那么用什么方法来监听一个对象是否被回收呢?当然用fianlize了;

请看代码:

public class Test {private static Test TEST= null;public static void main(String args[]) {TEST = new Test();TEST = null;System.gc();try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(TEST);}@Overridepublic void finalize() throws Throwable {System.out.println("要死了要死了要死了!");}
}

执行结果

要死了要死了要死了!
null

那是不是执行了finalize后,对象就一定会被回收呢?其实也不一定finalize调用时对象仅有一次拯救自己的机会,如下:

public class Test {private static Test TEST= null;public static void main(String args[]) {TEST = new Test();TEST = null;System.gc();try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(TEST);TEST = null;System.gc();try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(TEST);}@Overridepublic void finalize() throws Throwable {System.out.println("要死了要死了要死了!");TEST = this;}
}

结果

要死了要死了要死了!
com.Test@1aa9f99
null

可以看到在第一次垃圾回收时,在finalize方法给当前回收对象赋值给了新的引用,避免了被回收,不过finalize方法一个对象只能调用一次,在第二次回收时将不会被调用了。

从上述两个例子中我们可以得出:finalize可以监听一个对象被回收,但是不能保证调用了finalize的对象一定会被回收,同时一个对象在第二次标记回收时是不会触发finalize的!如果想绝对监听一个对象是否被回收,只有在JVM里面添加参数-XX:+PrintGCDetails分析GC日志咯

java成员变量何时被回收,以及监听回收相关推荐

  1. java成员变量定义_java变量之成员变量和局部变量以及它们的运行机制

    Java语言根据变量定义位置的不同,将变量分为成员变量和局部变量.成员变量指的是定义在类中(方法外)的变量,局部变量指的是定义在方法中的变量.同时成员变量以是否用static修饰分为类变量和实例变量. ...

  2. Java 成员变量和静态变量的区别

    文章目录 Java 成员变量和静态变量的区别 变量声明默认值 与 Python 的联系 实例变量的声明 类变量的声明 static 方法 Java 成员变量和静态变量的区别 1)成员变量所属于对象.所 ...

  3. java成员变量垃圾回收_JAVA 对象被垃圾回收后其成员变量可用吗? | 学步园

    我们知道JVM中一个对象实例超出作用域或无引用的时候会被垃圾回收,那么他被垃圾回收后,依赖其成员变量的其他实例是否还能正常使用呢?经过测试后发现即使一个实例被垃圾回收,如果他内部的数据被其他对象使用, ...

  4. 关于Java成员变量、局部变量、方法,在JVM的内存空间分配

    1.变量类型 2.类的结构 下面是一般类的结构 //类体=属性+状态(即:类体=变量+方法) public class 类名{ //类名最好首字母大写的英文String name; //在方法体外,所 ...

  5. Java成员变量与成员方法

    学而时习之,温故而知新. 成员变量: 在Java中对象的属性成为成员变量, 有时候很多人也喜欢把成员变量等同于全局变量, 因为成员变量在某一个类中都有效 (成员变量是定义在类中,方法体之外的变量.这种 ...

  6. Java成员变量与类变量_Java基础随记2-成员变量和类变量的区别

    由static修饰的变量称为静态变量,其实质上就是一个全局变量.如果某个内容是被所有对象所共享,那么该内容就应该用静态修饰:没有被静态修饰的内容,其实是属于对象的特殊描述. 不同的对象的实例变量将被分 ...

  7. java 成员变量 成员方法_《Java基础知识》Java成员变量,成员方法,构造方法和析构方法...

    一 成员变量 成员变量是指类的一些属性定义,标志类的静态特征,它的基本格式如下: [访问修饰符][修饰符][类型][属性名称]= [初始值] 访问修饰符:public(公共的):protected(受 ...

  8. java成员变量和局部变量的初始化和内存中的运行机制

    成员变量: 当系统加载类或创建类的实例时,系统会自动为成员变量分配内存空间,并在分配内存空间后,自动为成员变量指定初始值. eyeNum是类属性.name是实例属性 所有person实例访问eyeNu ...

  9. JAVA成员变量为什么不能在类体中先定义后赋值

    1 package dx; 2 3 public class Test1 { 4 5 int a111;//定义成员变量(全局变量) 6 7 8 9 // a = 1;//此处若给变量赋值,会报错,J ...

最新文章

  1. 无缝滚动—marquee实现向上滚动(适合发布通告)
  2. 程序开发是编写sql语句的注意事项
  3. Spark之伪分布式搭建、伪分布式Hadoop、Hive安装
  4. 在 SAP HANA database Explorer 里添加 HDI 容器
  5. 信息学奥赛一本通(1026:空格分隔输出)
  6. EXTI外部中断触发:神舟IV
  7. 刷题记录 CF每日一题打卡 2020.6月7-6月13
  8. 取一行多列数据中的最大值
  9. 使用python读取excel文件数据,修改dbf文件
  10. C++制作一个连点器
  11. [日推荐]『饿了么外卖服务』饿了么官方小程序,无需下载安装!
  12. mysql pxc 使用_MySQL PXC集群安装配置
  13. 点击给导航条加背景颜色
  14. CHM 打开时提示 已取消到该网页的导航
  15. python与ai的关系_Python与人工智能的关系原来是这样的...
  16. jmeter监控服务器插件jp@gc - PerfMon Metrics Collector报错 Operation timed out
  17. ajax的get json数据格式,jQuery / 用getJSON()方法加载JSON格式数据 - 汇智网
  18. Java工程师 操作系统(四) 面试题(Day35)
  19. Gym-101173K Key Knocking 思维+贪心
  20. lisp钢管_图纸管道材料代号说明

热门文章

  1. springboot 配置 druid 监控
  2. root用户和文件权限
  3. 已知矩形的三个顶点坐标,求最后一个的顶点坐标(向量求法)
  4. AOD.Net用户登录认证实验
  5. 跑后恢复方法(七种简单易行)
  6. 该怎么去形容你最贴切? 最懂政企的中国电子云
  7. html 上下翻页效果代码,原生js实现可以带上下翻页的翻页功能(代码)
  8. Vue生命周期函数解析及各个组件间调用顺序
  9. Java中一个接口可以继承多个接口吗?接口继承接口使用extends关键字
  10. smartctl 硬盘信息查询