Java (不是)对System.gc()的净调用

Java (不是)对System.gc()的净调用,java,garbage-collection,netty,Java,Garbage Collection,Netty,在查看基于Netty构建的应用程序的GC日志时,我注意到有标记为“System.GC()”的GC事件,例如: 通过搜索代码和使用的库,我们确定这些调用来自Netty(最终版本4.1.21) 我在文档中或通过搜索未能找到任何与此相关的内容。是否有任何地方我可以阅读到为什么会这样做,以及禁用显式GC可能会产生什么影响?我所能找到的就是它记录了有关System.gc()的一些信息,但没有关于它的有用信息 在我看到的事件中,GC似乎是在次优时间完成的,它在不需要GC的情况下执行完整GC,并且似乎不必要地

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

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

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

在我看到的事件中,GC似乎是在次优时间完成的,它在不需要GC的情况下执行完整GC,并且似乎不必要地将对象移动到了旧代

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

Netty本身不会触发System.gc()调用。只需搜索代码库,没有类似的内容。也就是说,当您试图分配直接缓冲区而内存不足时,JVM可能会尝试调用
System.gc()


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

增加最大直接内存,减少平均缓冲区大小,或者不创建这么多新连接都会有帮助+1我添加了一个正在写入日志的行的示例。当仅使用62MB的2GB堆时,强制执行GC。发生这种情况时,应用程序基本上没有加载。这很奇怪。我想你是写我链接的演示文稿的那个普通毛勒吧。你能解释一下幻灯片33上的意思吗:“还有Thread.sleep(100)和System.gc()?!?”对System.gc的引用似乎是rt.jar中的Bits.reserveMemory()方法。我猜您对sleep(100)和System.gc()的引用是关于这个方法的,以及为什么它不好,我认为它没有在Netty 4中使用。对的很抱歉造成误解。很抱歉,这是发生在其他一些没有使用Netty的应用程序上的。绝对不会生气。
[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]