有些人可能知道某些核心java API会对System.gc()进行显式调用。发生这种情况时,我知道两种情况:
所以,问题是:
答案 0 :(得分:5)
如果存在需要清理的分布式对象,RMI会调用System.gc()。您可以减少频繁执行GC或有效关闭GC。
您可以通过调用
来避免直接ByteBuffer需要GC在Sun / Oracle JVM上清理它们ByteBuffer bb = ByteBuffer.allocateDirect(SIZE);
((DirectBuffer) bb).cleaner().clean();
答案 1 :(得分:2)
我不明白为什么他们甚至暴露了gc()方法。即使在文档中,Java也很清楚这种行为是不可预测的。医生说
“调用gc方法表明Java虚拟机花费了很多精力来回收未使用的对象”
意思是,它可以做任何事情,包括什么。
至于问题,许多应用服务器在这里和那里调用System.gc()。 WebSphere是一个主要的攻击者,您可以在WAS / Portal代码库中找到它。在我能记住的开源库/框架中没有看到它。可能致力于为这些框架做出贡献的人有足够的意识,不使用具有不确定行为的操作。
我的猜测是,当开发人员认为“在某些情况下,此操作可能会在处理过程中使用大量”临时“(短命)内存时,它会被调用,所以我会做一些垃圾收集收回它“。这也可能是您的RMI场景的情况。在我看来,这是假的。在某些情况下,调用System.gc()可以通过过早(并且不必要地)触发完整的GC周期来降低性能。重点是,垃圾收集器非常聪明,除非你确定你知道的更好,否则不要试图搞砸它。
答案 2 :(得分:1)
JDK实现确切地知道它自己的System.gc()
行为如何。 JDK不必假装不可知,将自己限制在标准抽象行为,而不是具体的专有行为(当然符合标准行为)
是的,可以根据需要调用System.gc()
。我们不应该。