EXCEL中宏毒X97M.Laroux.DX1的解决办法-英雄云拓展知识分享
161
2023-11-07
【摘要】 本书摘自《深入理解 Java 虚拟机 JVM 高级特性与最佳实践(第3版)》一书中第3章,第3节,周志明著。
3.3.1 分代收集理论
当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”(Generational Collection) 的理论进行设计,分代收集名为理论,实质是一套符合大多数程序运行实际情况的经验法 则,它建立在两个分代假说之上:
1)弱分代假说(Weak Generational Hypothesis): 绝大多数对象都是朝生夕灭的。
2)强分代假说 (Strong Generational Hypothesis): 熬过越多次垃圾收集过程的对象就 越难以消亡:
这两个分代假说共同奠定了多款常用的垃圾收集器的一致的设计原则:收集器应该将 Java 堆划分出不同的区域,然后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的 次数)分配到不同的区域之中存储。显而易见,如果一个区域中大多数对象都是朝生夕灭, 难以熬过垃圾收集过程的话,那么把它们集中放在一起,每次回收时只关注如何保留少量
θ Product版、FastDebug 版 HotSpot 虚拟机的差别可参见前文1.6节。
e 原著名为《The Garbage Collection Handbook》,2011年出版,中文版在2016年由机械工业出版社翻译 引进国内。
国 值得注意的是,分代收集理论也有其缺陷,最新出现(或在实验中)的几款垃圾收集器都展现出了面向 全区域收集设计的思想,或者可以支持全区域不分代的收集的工作模式。存活而不是去标记那些大量将要被回收的对象,就能以较低代价回收到大量的空间;如果 剩下的都是难以消亡的对象,那把它们集中放在一块,虚拟机便可以使用较低的频率来回 收这个区域,这就同时兼顾了垃圾收集的时间开销和内存的空间有效利用。
在 Java 堆划分出不同的区域之后,垃圾收集器才可以每次只回收其中某一个或者某些 部分的区域——因而才有了 “Minor GC”“Major GC”“Full GC” 这样的回收类型的划分; 也才能够针对不同的区域安排与里面存储对象存亡特征相匹配的垃圾收集算法——因而发 展出了“标记-复制算法”“标记-清除算法”“标记-整理算法”等针对性的垃圾收集算法。 这里笔者提前提及了一些新的名词,它们都是本章的重要角色,稍后都会逐一登场,现在 读者只需要知道,这一切的出现都始于分代收集理论。
把分代收集理论具体放到现在的商用Java虚拟机里,设计者一般至少会把 Java堆划分 为新生代 (Young Generation) 和老年代 (Old Generation) 两个区域9。顾名思义,在新生 代中,每次垃圾收集时都发现有大批对象死去,而每次回收后存活的少量对象,将会逐步 晋升到老年代中存放。如果读者有兴趣阅读 HotSpot 虚拟机源码的话,会发现里面存在着 一些名为“*Generation”的实现,如 “DefNewGeneration” 和 “ParNewGeneration” 等 , 这些就是 HotSpot 的“分代式垃圾收集器框架”。原本 HotSpot 鼓励开发者尽量在这个框架 内开发新的垃圾收集器,但除了最早期的两组四款收集器之外,后来的开发者并没有继续 遵循。导致此事的原因有很多,最根本的是分代收集理论仍在不断发展之中,如何实现也 有许多细节可以改进,被既定的代码框架约束反而不便。其实我们只要仔细思考一下,也 很容易发现分代收集并非只是简单划分一下内存区域那么容易,它至少存在一个明显的困 难:对象不是孤立的,对象之间会存在跨代引用。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。