JAVA GC主GC与次GC的区别

3
在我们的低延迟应用程序中,我们有缓存数据(驻留在TG中)和短寿命的对象,这些对象在YG中消失。我发现小型GC时间和大型GC时间之间存在显着差异。我怀疑这与TG相对较大的大小有关。 有人能解释一下GC时间如何与TG大小相关吗?小型GC非常频繁且快速。

2
次要的垃圾回收通常是“停止-复制”方式,而主要的则是并发标记-清除方式。你不会想因为复制一个太大的池而经常停止。 - SK-logic
2个回答

2

在YG中幸存的对象会被移动到TG / Old代,以释放YG中的空间。 为了确保次要收集不需要太长时间并且可以更频繁地运行,YG的大小保持较小。在这些次要GC期间,仍具有引用的对象会被移动到TG。

因此,TG的大小更大,因为通常在经过几次YG清理后幸存的较大对象会移动到该段。此外,TG中的清理不会很频繁,因此可以分配更大的内存。

因此,次要GC清除YG中的对象,但是主要GC会清除YG和TG。


0
主要的一点是,GC 的时间并不由 TG 的大小所决定,而是由其中对象的数量所决定。一个注重性能的应用程序不应使用堆缓存。目前有许多现有的支持离堆缓存的缓存库。

我读到在离堆缓存中会有性能问题。缓存的对象不是键值对,而是一个大对象。我们需要同时频繁地访问完整的对象(每秒10000次)。 - saurabh agrawal
每秒1000次是相当低的速率,但如果它是一个巨大的对象,那么在离堆缓存中确实是一个问题。请注意,GC速度不是由于您使用单个根引用来引用对象而决定的,而是由从您的对象可达的实例总数决定的。 - Marko Topolnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接