java永生代和新生代_Java:永生的对象和对象的复活
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:永生的对象和对象的复活相关推荐
- java构造方法 隐含三步_Java入门总结--------类和对象关系以及构造方法
Java中重写父类的方法要遵循"两同两小一大"规则, "两同"即方法名相同.形参列表相同: "两小"指的是子类方法的返回值类型应比父类方法返 ...
- java 堆中的新生代_Java堆内存_Young Gener_Old Generation_新生代和老年代
使用JDK8 Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象. 在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ).新 ...
- java获取泛型的值_java 反射之获取泛型对象的所有字段与对应的值(包括父类的)...
public static void main(String[] args) throwsIntrospectionException { SysUser obj= newSysUser(); obj ...
- java dom获取命名空间属性_java – 如何在XML DOM对象中添加命名空间前缀?
我正在尝试使用特定的命名空间来构建一个 XML文档.我想要生成的最终文档应该是这样的: token token token 这是我到目前为止. Document document = Document ...
- JVM的年轻代、年老代(老年代)和永生代(持久代)【Loadrunner性能调优】
1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...
- java年轻代minor gc_jvm之年轻代(新生代)、老年代、永久代以及GC原理详解、GC优化...
关于JVM,也许你听过这些术语:年轻代(新生代).老年代.永久代.minor gc(young gc).major gc.full gc 不要急,先上图,这是jvm 堆内存结构图 仔细的你发现了 图中 ...
- java array 元素的位置_Java常见面试题 非常实用「个人经验」
Java 容器都有哪些 Collection 的子类 List.Set List 的子类 ArrayList.LinkedList等 Set 的子类 HashSet.TreeSet等 Map 的子类 ...
- java nio 堆外内存_Java堆外内存之突破JVM枷锁
对于有Java开发经验的朋友都知道,Java中不需要手动的申请和释放内存,JVM会自动进行垃圾回收:而使用的内存是由JVM控制的. 那么,什么时机会进行垃圾回收,如何避免过度频繁的垃圾回收?如果JVM ...
- JAVA分代收集机制详解
Java堆中是JVM管理的最大一块内存空间.主要存放对象实例. 在JAVA中堆被分为两块区域:新生代(young).老年代(old). 堆大小=新生代+老年代:(新生代占堆空间的1/3.老年代占堆空间 ...
最新文章
- 悉尼大学陶大程:遗传对抗生成网络有效解决GAN两大痛点
- 使用android ProgressBar和Toast生成一个界面
- linux系统格式化磁盘
- mysql使用数据库预处理_php中对MYSQL操作之预处理技术(2)数据库dql查询语句
- Python+Django+Nginx+Uwsgi 详细部署过程(爬坑过程,可以了解各个软件的执行流程,看过)
- 2、python机器学习基础教程——K近邻算法鸢尾花分类
- python自动化测试-D6-学习笔记之一(常用模块补充datetime模块)
- time是python的标准库吗_python3关于date和time的标准库
- 4562亿元教育经费收从哪里花向何处
- shell脚本 回顾 小练习
- SSO之CAS单点登录实例演示
- 计算机office视频百度云,word视频教程百度云 office2016视频教程
- mysql 面试题 总结
- 网络/Network - 应用层 - HTTP - GET 通过 Body 来发送数据 - 学习/实践
- C语言从入门到放弃2022年8月3号
- 多媒体计算机辅助英语教学,浅谈多媒体计算机辅助英语教学
- 电子电路基础 (12)——功率放大电路原理分析
- 7、Cannot broadcast operands together.
- 苹果系统备份文件服务器地址,苹果备份文件在哪里能找到?默认路径在这儿(不知道的进来看看)...
- laravel图形验证码(借用了TP的图形验证码类)非常好用简单,非常适合前后端分离的项目
热门文章
- YBTOJ:放置棋子(费用流)
- 选数游戏(ybtoj-二叉堆)
- 牛客练习赛84F-牛客推荐系统开发之下班【莫比乌斯反演,杜教筛】
- jzoj4616-[NOI2016模拟7.12]二进制的世界【平衡规划,dp】
- nssl1460-逛机房【bfs】
- P3750-[六省联考2017]分手是祝愿【期望dp】
- P2513-[HAOI2009]逆序对数列【dp,前缀和】
- P1463-[POI2002][HAOI2007]反素数【约数,数论】
- 【动态规划】机器分配 (ssl 1639)
- Prufer序列 生成树定理