你对新一代JVM垃圾回收算法是否了解,这里和大家分享一下,传统的分代JVM垃圾回收方式确实也考虑了实时性要求而提供了并发回收器,支持***暂停时间的设置,但是受限于分代JVM垃圾回收的内存划分模型,其效果也不是很理想,于是就诞生了新一代JVM垃圾回收算法。
新一代JVM垃圾回收算法
JVM垃圾回收的瓶颈
传统分代JVM垃圾回收方式,已经在一定程度上把JVM垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限。但是他无法解决的一个问题,就是FullGC所带来的应用暂停。在一些对实时性要求很高的应用场景下,GC暂停所带来的请求堆积和请求失败是无法接受的。这类应用可能要求请求的返回时间在几百甚至几十毫秒以内,如果分代JVM垃圾回收方式要达到这个指标,只能把***堆的设置限制在一个相对较小范围内,但是这样有限制了应用本身的处理能力,同样也是不可接收的。
分代JVM垃圾回收方式确实也考虑了实时性要求而提供了并发回收器,支持***暂停时间的设置,但是受限于分代JVM垃圾回收的内存划分模型,其效果也不是很理想。
为了达到实时性的要求(其实Java语言最初的设计也是在嵌入式系统上的),一种新JVM垃圾回收方式呼之欲出,它既支持短的暂停时间,又支持大的内存空间分配。可以很好的解决传统分代方式带来的问题。
增量收集的演进
增量收集的方式在理论上可以解决传统分代方式带来的问题。增量收集把对堆空间划分成一系列内存块,使用时,先使用其中一部分(不会全部用完),垃圾收集时把之前用掉的部分中的存活对象再放到后面没有用的空间中,这样可以实现一直边使用边收集的效果,避免了传统分代方式整个使用完了再暂停的回收的情况。
当然,传统分代收集方式也提供了并发收集,但是他有一个很致命的地方,就是把整个堆做为一个内存块,这样一方面会造成碎片(无法压缩),另一方面他的每次收集都是对整个堆的收集,无法进行选择,在暂停时间的控制上还是很弱。而增量方式,通过内存空间的分块,恰恰可以解决上面问题。
【编辑推荐】