在查看基于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()。
答案 0 :(得分:2)
netty本身不会触发System.gc()调用。只是搜索代码库就没有这样的东西。也就是说,当您尝试分配直接缓冲区并且没有足够的内存时,JVM可能会尝试调用System.gc()
。
如果这是System.gc()
的来源,我建议提高JVM允许我们使用的最大直接内存量。