我的服务中有一个3GB的本地缓存(我的服务器的内存总量是16GB),通过在JDK11中使用ZGC,我发现每个周期的并发标记时间太长(如果有2个并发线程,几乎需要5秒)。所以我想知道是否有一种方法,ZGC只是跳过标记这个本地缓存?我已经尝试过将本地缓存分为两层,第一层是Caffeine,第二层是堆外缓存,但是没有效果。
ig9co6j11#
ZGC如何避免扫描较大的本地缓存,以减少GC周期的并发标记时间?不能。ZGC将标记并收集整个堆,这是无法改变的。因为ZGC不是分代的,所以从技术上讲,不可能安全地进行部分收集。堆中未标记的部分中的任何可达对象都可以引用正在收集的部分中的任何对象。包括任何无法以其他方式访问的对象。因此,如果ZGC没有标记整个堆,则可达对象可能会被删除!如果您的问题是GC周期太长,您可以选择:
您也可以尝试改用G1GC。或者您可以重新架构您的服务,以便可以运行多个示例;例如通过sharding服务中的数据。
1条答案
按热度按时间ig9co6j11#
ZGC如何避免扫描较大的本地缓存,以减少GC周期的并发标记时间?
不能。ZGC将标记并收集整个堆,这是无法改变的。
因为ZGC不是分代的,所以从技术上讲,不可能安全地进行部分收集。堆中未标记的部分中的任何可达对象都可以引用正在收集的部分中的任何对象。包括任何无法以其他方式访问的对象。因此,如果ZGC没有标记整个堆,则可达对象可能会被删除!
如果您的问题是GC周期太长,您可以选择:
您也可以尝试改用G1GC。
或者您可以重新架构您的服务,以便可以运行多个示例;例如通过sharding服务中的数据。