什么是对象复活?

当没有其他对象引用该对象时,该Java对象可以进行垃圾回收。 当JVM:s垃圾收集器最终将要删除未使用的对象时,将调用该对象的finalize()方法。 但是,如果我们再次使用对象自己的finalize()方法重新创建对该对象的引用,则该对象可以复活。 在这种情况下,JVM将检测到再次引用了该对象,并避免将其删除。 隐喻地,该物体已经从死亡中复活了……

public class Immortal {private static final Set<Immortal> immortals = new HashSet<>();@Overrideprotected void finalize() throws Throwable {System.out.println(Immortal.class.getSimpleName() + "::finalize for " + this);immortals.add(this); // Resurrect the object by creating a new reference }}

可以通过以下方式测试复活属性:

public class NewMain {public static void main(String[] args) {new Immortal();System.gc();sleep(1_000);System.gc();prompt("Press any key...");}private static void prompt(String msg) {try {System.out.println(msg);System.in.read();} catch (IOException io) {}}private static void sleep(long duration) {try {Thread.sleep(duration);} catch (InterruptedException ie) {}}}

这将给出以下输出:

Immortal::finalize for com.blogspot.minborgsjavapot.resurected_object.Immortal@635cb856
Press any key...

通过检查Java堆,我们还可以看到尽管对象的终结器被调用,该对象仍然存在:

pemi$ jps
21735 NewMain
21736 Jpspemi$ jmap -histo 21735 | grep Immortal164:             1             16  com.blogspot.minborgsjavapot.resurected_object.Immortal

终结器被调用了多少次?

如果以后取消引用了复活的对象,则该对象又有资格进行垃圾回收。 但是,这次
由于Java最多只能调用finalizer一次,因此不会再次调用finalize()方法。 我们可能还记得,不能保证终结器会被调用。 例如,如果程序由于任何原因终止,则仅放弃JVM中的对象,并且最终定形器将根本不会被调用,如在本示例中可以看到的:

public class NewMain2 {public static void main(String[] args) {new Immortal();}}

当我们运行上述代码片段时,我们观察到从未调用Immortal::finalizer

对象复活好吗?

与使用finalize()方法一样,我们必须非常谨慎。 对我们Java开发人员的一般建议是根本不使用finalize() 。 此外,有人可能会说,复活一个对象与故意造成内存泄漏是一样的。

但是,有一些有趣的对象复活应用程序。 也许我们想对我们的对象进行事后分析,而又不更改使用该对象的实际应用程序。 通过使用对象复活,我们可以保存那些对象并在以后分析它们的内部状态,而与使用它们的应用程序无关。

翻译自: https://www.javacodegeeks.com/2016/03/java-immortal-objects-object-resurrection.html

Java:不朽的对象和对象复活相关推荐

  1. JAVA基础七 类和对象

    文章目录 JAVA基础七 类和对象 01 引用 02 继承 03 方法重载 04 构造方法 05 this 06 传参 07 包 08 访问修饰符 09 类属性 10 类方法 11 属性初始化 12 ...

  2. Java学习总结:51(对象序列化)

    对象序列化 对象序列化的本质实际上就是将内存中所保存的对象数据转换为二进制数据流进行传输的操作. 但并不是所有类的对象都可以直接进行序列化操作,要被序列化的对象所在的类一定要实现java.io.Ser ...

  3. Java学习总结:34(对象克隆)

    对象克隆 对象克隆就是对对象的复制操作,在Object类中存在一个clone()方法用于对象的克隆操作.该方法如下: protected Object clone() throws CloneNotS ...

  4. java培训教程分享:Java中怎样将数据对象序列化和反序列化?

    本期为大家介绍的java培训教程是关于"Java中怎样将数据对象序列化和反序列化?"的内容,相信大家都知道,程序在运行过程中,可能需要将一些数据永久地保存到磁盘上,而数据在Java ...

  5. java使用其他项目的对象,Java对象的复制方法总结

    参考:<Java经典编程>实例054~058,<Java7 入门经典> 1.   使用构造函数复制对象 对象是传址调用,直接通过"="来进行连接是并没有达到 ...

  6. java对象头_浅谈java对象结构 对象头 Markword

    概述 对象实例由对象头.实例数据组成,其中对象头包括markword和类型指针,如果是数组,还包括数组长度; | 类型 | 32位JVM | 64位JVM| | ------ ---- | ----- ...

  7. java 如何对由json对象构成的数组形式的字符串进行遍历?

    1.情景展示 现在已知字符串为: [{"name":"微微笑","img":"http://zos.alipayobjects.c ...

  8. 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )

    文章目录 I . 调用 Java 方法流程 II . 获取 jclass 对象 ( GetObjectClass ) III . 获取 jclass 对象 ( FindClass ) IV . JNI ...

  9. 计算机二级日期格式,09年计算机二级辅导:指定格式的日期字符串转化成java.util.Date类型日期对象...

    09年计算机二级辅导:指定格式的日期字符串转化成java.util.Date类型日期对象 分类:计算机等级| 更新时间:2008-10-16| 来源:教育联展网 将未指定格式的日期字符串转化成java ...

  10. Java I/O中的对象序列化

    Java I/O中的对象序列化 Java对象序列化将那些实现了Serializable接口的对象转换成一个字节序列,并能够以后将这个字节序列完全恢复为原来的对象.利用对象的序列化,可以实现轻量级持久性 ...

最新文章

  1. linux下c语言按q退出_在linux下C语言写了一个while循环,怎么实现按任意键退出。如何编写程序?...
  2. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1079:计算分数加减表达式的值
  3. android ne调试工具,Android调试工具adb的正确使用方式
  4. python列表切片赋值_Python中对切片赋值原理分析
  5. 量词逻辑量词里面的v表示?_知识表示能力问答中的人工智能量词(MCQ)
  6. Tensorflow 十六 用tf.keras函数重写Mnist识别
  7. JDBC学习(五、预编译语句对象)
  8. dump文件导入表修复工具——Imports Fixer
  9. JS继承的几种方式及优缺点
  10. 【kimol君的无聊小发明】—用python写音乐下载器
  11. delphi SysErrorMessage 函数和系统错误信息表 good
  12. 西安三日游-梦回长安
  13. 华为宣布出售荣耀,声明来了
  14. NAS如何进行磁盘碎片整理?
  15. C语言删除字符串的所有尾部空格
  16. [开源工具]2022/2023 分享好用的免费的云短信/临时短信[Temp Message]
  17. 腾讯云人脸验证使用方法
  18. error: failed to push some refs to 'git@github.com: xxx / xxxx.git'
  19. 红米Note5_橙狐RecoveryR11_MIUI12_20.6.18_谷歌相机7.3
  20. 网站架构设计发展路径学习

热门文章

  1. Spring Boot功能实战
  2. java实现遍历树形菜单方法——设计思路【含源代码】
  3. discuz 版块导航function_forumlist.php,Discuz! X2“扩建”左侧版块导航 让社区层次一目了然...
  4. 本地方法(JNI)——调用 java 方法
  5. java 创建uri_使用UriBuilder快速创建URI
  6. xml json 比较_JSON和XML:它们如何比较?
  7. java 示例_功能Java示例 第3部分–不要使用异常来控制流程
  8. 众神进入瓦尔哈拉_一时冲动:“通往瓦尔哈拉之路的冒险”
  9. 终端查看命令有哪些功能命令_从命令式功能到纯粹功能式功能,再返回:Monads与范围内的延续...
  10. 异步http 超时_具有CompletableFuture的异步超时