java永生代和新生代

什么是物体复活?

当没有其他对象引用该对象时,该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永生代和新生代

java永生代和新生代_Java:永生的对象和对象的复活相关推荐

  1. java构造方法 隐含三步_Java入门总结--------类和对象关系以及构造方法

    Java中重写父类的方法要遵循"两同两小一大"规则, "两同"即方法名相同.形参列表相同: "两小"指的是子类方法的返回值类型应比父类方法返 ...

  2. java 堆中的新生代_Java堆内存_Young Gener_Old Generation_新生代和老年代

    使用JDK8 Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象. 在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ).新 ...

  3. java获取泛型的值_java 反射之获取泛型对象的所有字段与对应的值(包括父类的)...

    public static void main(String[] args) throwsIntrospectionException { SysUser obj= newSysUser(); obj ...

  4. java dom获取命名空间属性_java – 如何在XML DOM对象中添加命名空间前缀?

    我正在尝试使用特定的命名空间来构建一个 XML文档.我想要生成的最终文档应该是这样的: token token token 这是我到目前为止. Document document = Document ...

  5. JVM的年轻代、年老代(老年代)和永生代(持久代)【Loadrunner性能调优】

    1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...

  6. java年轻代minor gc_jvm之年轻代(新生代)、老年代、永久代以及GC原理详解、GC优化...

    关于JVM,也许你听过这些术语:年轻代(新生代).老年代.永久代.minor gc(young gc).major gc.full gc 不要急,先上图,这是jvm 堆内存结构图 仔细的你发现了 图中 ...

  7. java array 元素的位置_Java常见面试题 非常实用「个人经验」

    Java 容器都有哪些 Collection 的子类 List.Set List 的子类 ArrayList.LinkedList等 Set 的子类 HashSet.TreeSet等 Map 的子类 ...

  8. java nio 堆外内存_Java堆外内存之突破JVM枷锁

    对于有Java开发经验的朋友都知道,Java中不需要手动的申请和释放内存,JVM会自动进行垃圾回收:而使用的内存是由JVM控制的. 那么,什么时机会进行垃圾回收,如何避免过度频繁的垃圾回收?如果JVM ...

  9. JAVA分代收集机制详解

    Java堆中是JVM管理的最大一块内存空间.主要存放对象实例. 在JAVA中堆被分为两块区域:新生代(young).老年代(old). 堆大小=新生代+老年代:(新生代占堆空间的1/3.老年代占堆空间 ...

最新文章

  1. 悉尼大学陶大程:遗传对抗生成网络有效解决GAN两大痛点
  2. 使用android ProgressBar和Toast生成一个界面
  3. linux系统格式化磁盘
  4. mysql使用数据库预处理_php中对MYSQL操作之预处理技术(2)数据库dql查询语句
  5. Python+Django+Nginx+Uwsgi 详细部署过程(爬坑过程,可以了解各个软件的执行流程,看过)
  6. 2、python机器学习基础教程——K近邻算法鸢尾花分类
  7. python自动化测试-D6-学习笔记之一(常用模块补充datetime模块)
  8. time是python的标准库吗_python3关于date和time的标准库
  9. 4562亿元教育经费收从哪里花向何处
  10. shell脚本 回顾 小练习
  11. SSO之CAS单点登录实例演示
  12. 计算机office视频百度云,word视频教程百度云 office2016视频教程
  13. mysql 面试题 总结
  14. 网络/Network - 应用层 - HTTP - GET 通过 Body 来发送数据 - 学习/实践
  15. C语言从入门到放弃2022年8月3号
  16. 多媒体计算机辅助英语教学,浅谈多媒体计算机辅助英语教学
  17. 电子电路基础 (12)——功率放大电路原理分析
  18. 7、Cannot broadcast operands together.
  19. 苹果系统备份文件服务器地址,苹果备份文件在哪里能找到?默认路径在这儿(不知道的进来看看)...
  20. laravel图形验证码(借用了TP的图形验证码类)非常好用简单,非常适合前后端分离的项目

热门文章

  1. YBTOJ:放置棋子(费用流)
  2. 选数游戏(ybtoj-二叉堆)
  3. 牛客练习赛84F-牛客推荐系统开发之下班【莫比乌斯反演,杜教筛】
  4. jzoj4616-[NOI2016模拟7.12]二进制的世界【平衡规划,dp】
  5. nssl1460-逛机房【bfs】
  6. P3750-[六省联考2017]分手是祝愿【期望dp】
  7. P2513-[HAOI2009]逆序对数列【dp,前缀和】
  8. P1463-[POI2002][HAOI2007]反素数【约数,数论】
  9. 【动态规划】机器分配 (ssl 1639)
  10. Prufer序列 生成树定理