垃圾采集算法-世代采集算法(Generational 采集).
优采云 发布时间: 2020-08-07 18:22当前,商用虚拟机的垃圾采集采用“ Generational 采集”算法. 该算法没有任何新思想,但是会根据对象的生命周期将内存分为几个块. 通常,Java堆分为新一代和老一代,因此可以根据每一代的特性采用最合适的采集算法. 在新一代中,每次垃圾回收都会发现大量对象死亡,只有少数能够生存,然后选择复制算法,并且只需少量的生存对象复制成本就可以完成复制算法. 在晚年,由于对象的存活率很高并且没有多余的空间来保证其分配,因此有必要使用“标记清除”或“标记排序”算法进行回收.
在Java虚拟机的世代垃圾采集机制中,可以将应用程序的可用堆空间划分为年轻代和旧代,然后将年轻代划分为Eden区域,From区域和To区域.
系统创建对象时,它始终在Eden区域中运行. 当该区域已满时,它将触发YoungGC,这是年轻一代的垃圾采集.
通常来说,此时并非所有对象都是无用的,因此仍然可用的对象将被复制到“发件人”区域.
这样,便清理了整个伊甸园区域,您可以继续创建新对象. 当伊甸园区域再次用完时,YoungGC将再次被触发. 然后,请注意,这次与现在略有不同. 这次触发YoungGC之后,在Eden区域和From区域中仍在使用的对象将被复制到To区域.
下一个YoungGC将把Eden区域和To区域中仍在使用的对象复制到From区域.
几个YoungGC之后,一些对象在From和To之间来回徘徊. 此时,底线(阈值)显示在“从”和“到”区域中. 如果这些家伙还没死,很抱歉,让我们去(复制)老年吧.
经过这么多折腾,年老的人无法忍受(空间已用完). 好的,让我们转到完整的GC,即完全恢复. 让我们摆脱它.
完全恢复就像我们刚刚进行的大型清洗一样. 毕竟,操作比较大并且成本很高. 它不能与通常的小型工作日(Young GC)相提并论,因此,如果Full GC的使用过于频繁,无疑会对系统性能产生重大影响.
因此,我们应该合理设置年轻一代和老一代的大小,并尽量减少Full GC的运行
参考
[1]“深入了解Java虚拟机-JVM的高级功能和最佳实践”,周志明,机械工业出版社.
[2]“大型网站的技术架构-核心原理和案例研究”,李志辉,电子工业出版社.
转载: