博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【JAVA笔记——道】JAVA对象销毁
阅读量:6817 次
发布时间:2019-06-26

本文共 1133 字,大约阅读时间需要 3 分钟。

每一个对象都有两个属性:

1. Reachable可达,Finalizer-Reachable终接器-可达,Unreachable不可达
2. Unfinalized未终结,Finalizable可终结,Finlized已终结

对象可达:对象被任意一个存活线程引用。对程序进行优化设计的一种方法是减少原本可达状态的对象。例如,当编译器或代码生成工具不论明确或隐性声明一个变量或者参数时,变量或参数不再使用NULL去存储一个可能被回收的对象。

终接器-可达:对象可以被处于终结状态的链接或者存在引用,但并不会被任何存活的线程访问到。

不可达:对象不能通过任何方法访问。

未终结:对象未被Finalizer(终接器)自动访问finalize方法

已终结:对象已被Finalizer(终接器)自动访问finalize方法

可终结:对象未被Finalizer(终接器)自动访问,但JVM已经访问finalize方法

对象生命周期转化图

对象生命周期转化图

A:对象创建

B C D E F : 一个可达的对象的引用程序执行过程中废弃
G H : 如果JVM发现一个 未终结 对象变为 终接器-可达 或者 不可达
I :JVM发现一个 已终结 对象状态变为 不可达,这时可能发生内存回收导致对象彻底回收
J K : JVM会一直执行某个线程,将任何 可回收对象的 finalize方法调用。对象转变为 已终结 可达状态
L M N : JVM会一直执行某个线程,将任何 可回收对象的 finalize方法调用,此时发生对象自救对象转变为可达状态
O : 如果一个类的对象未覆盖finalize方法,对象突然消失而不是等待之后把对象转变为不可达状态,那么对象的实例会转变为不可达状态。

对象不可能处于 不可达 可终结,由于对象可以被终接器调用终结方法,因此对象必然是可达的,这样终接器线程才能够调用对象的终结方法。因此一个对象只能处于上述八种状态。

一个对象被终结后,在内存自动回收管理器将对象转变为不可达状态前不能再进行对对象进行操作。

当一个未终结对象从可终结状态转变为已终结状态,JVM不会自动调用多次任何对象的finalize方法,即使这个对象再一次变为可达在其变为已终结状态之后。

终接器明确的调用不受当前对象状态的影响,且不会改变对象的终结属性。

程序狗们得注意啦,终接器在启动期间可以自动调用方法,即使对象状态为可达,更进一步来说,终接器也可以自动调用对象的普通方法。因此建议设计对象的finalize方法尽量简单和安全,这样可以使程序的健壮性更好。

原地址:

对象销毁过程demo

转载于:https://www.cnblogs.com/cunchen/p/9464162.html

你可能感兴趣的文章
spring ioc aop 理解
查看>>
python学习资料
查看>>
JQuery与js具体使用的区别(不全,初学)
查看>>
Hyper-V快速导入虚拟机的两个注意事项
查看>>
【转】getopt模块,实现获取命令行参数
查看>>
安装JDK和配置环境变量
查看>>
C# 正则表达式大全
查看>>
pytorch梯度裁剪(Clipping Gradient):torch.nn.utils.clip_grad_norm
查看>>
【VUE】@click加上v-bind绑定切换类名及动画事件
查看>>
Microsoft发布新一代主机:Xbox One
查看>>
运维经验分享:关于系统运维监控的几点建议
查看>>
jQuery渐隐渐现字体发虚的问题
查看>>
[SDOI2008]烧水问题
查看>>
杂项之rabbitmq
查看>>
【转】关于大型网站技术演进的思考(十)--网站静态化处理—动静整合方案(2)...
查看>>
jQuery练习题HTML文件
查看>>
SQL注入原理
查看>>
MySQL 锁(lock与latch)
查看>>
python
查看>>
DataTable数据存入指定路径的Excel文件
查看>>