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