ZGC如何避免扫描大型本地缓存以减少GC周期的并发标记时间?



我的服务中有一个3GB的本地缓存(我的服务器的总内存是16GB),通过在JDK11中使用ZGC,我发现并发标记时间在每个周期中太长(如果有2个并发线程几乎是5秒)。

所以我想知道是否有一种方法,ZGC只是跳过标记这个本地缓存?

我已经尝试将这个本地缓存分为两层缓存,第一层是咖啡因,第二层是堆外缓存。但是没有成功。

ZGC如何避免扫描大型本地缓存以减少GC周期的并发标记时间?

它不能。ZGC将标记和收集整个堆,并且没有办法改变这一点。

由于ZGC不是分代的,因此在技术上不可能安全地执行部分收集。堆中未标记的部分中的任何可访问对象都可以引用正在收集的部分中的任何对象。包括任何无法联系到的人。因此,如果ZGC没有标记整个堆,则可以删除可访问的对象!

如果你的问题是GC周期太长,你的选择是:

  • 增加并发GC线程数。
  • 减少堆大小
  • 查找并修复任何可能导致内存和CPU争用的外部原因;例如,确保你实际上有16GB的实际RAM…而不是由管理程序提供的过度使用RAM。

您也可以尝试使用G1GC。

或者你可以重新构建你的服务,这样你就可以运行多个实例;例如,通过对服务中的数据进行分片。

最新更新