(不)Netty调用System.gc()

时间:2019-01-24 18:15:24

标签: java garbage-collection netty

在查看基于Netty构建的应用程序的GC日志时,我注意到有一些标有'System.gc()'的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在次佳的时间完成,并且在不需要时执行了完整的GC,并且似乎不必要地将对象移到了旧一代。

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

1 个答案:

答案 0 :(得分:2)

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

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