(不)Netty 调用 System.gc()

(NOT) Netty calls to System.gc()

在查看基于 Netty 构建的应用程序的 GC 日志时,我注意到有 GC 事件标记为 'System.gc()',例如:

[GC (System.gc()) [PSYoungGen: 63506K->64K(637952K)] 126048K->62605K(2036224K), 0.0035823 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
[Full GC (System.gc()) [PSYoungGen: 64K->0K(637952K)] [ParOldGen: 62541K->62541K(1398272K)] 62605K->62541K(2036224K), [Metaspace: 82261K->82261K(1120256K)], 0.1926316 secs] [Times: user=0.47 sys=0.00, real=0.19 secs] 

在搜索代码和正在使用的库后,我们确定这些调用来自 Netty(最终版本 4.1.21)。

我无法在文档中或通过搜索找到与此相关的任何内容。有什么地方可以让我了解为什么要这样做以及禁用显式 GC 可能会产生什么影响?我所能找到的只是 this presentation,它记录了一些关于 System.gc() 但没有关于它的有用信息。

在我看到的事件中,GC 似乎是在次优时间完成的,它在需要 none 时执行了完整的 GC,并且似乎已将对象移动到老年代没必要。

更正:这最初归因于 Netty,但在进一步检查后发现并非如此。 Netty 不会调用 System.gc().

netty本身没有触发System.gc()调用。只需搜索代码库,就没有这样的东西。也就是说,当您尝试分配直接缓冲区并且没有足够的剩余内存时,JVM 可能会尝试调用 System.gc()

如果这是 System.gc() 的来源,我建议提高 JVM 允许我们使用的最大直接内存量。