Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 核心API的System.gc()调用_Java_Garbage Collection_Jvm - Fatal编程技术网

Java 核心API的System.gc()调用

Java 核心API的System.gc()调用,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,有些人可能知道一些核心java API会显式调用System.gc()。我知道发生这种情况的两种情况: 尼奥。我相信这样做是为了在系统耗尽“直接”内存时对直接字节缓冲区进行一些清理 马绍尔群岛共和国。在这里,原因对我来说不是很清楚 因此,问题是: 您知道RMI需要System.gc()的原因吗 您知道核心API(甚至一些其他流行的库)可以直接调用System.gc()的其他情况吗 如果存在需要清理的分布式对象,RMI将调用System.gc()。您可以使它执行GC的频率降低或有效地将其关闭 您可

有些人可能知道一些核心java API会显式调用System.gc()。我知道发生这种情况的两种情况:

  • 尼奥。我相信这样做是为了在系统耗尽“直接”内存时对直接字节缓冲区进行一些清理
  • 马绍尔群岛共和国。在这里,原因对我来说不是很清楚
  • 因此,问题是:

  • 您知道RMI需要System.gc()的原因吗
  • 您知道核心API(甚至一些其他流行的库)可以直接调用System.gc()的其他情况吗
  • 如果存在需要清理的分布式对象,RMI将调用System.gc()。您可以使它执行GC的频率降低或有效地将其关闭

    您可以通过调用

    ByteBuffer bb = ByteBuffer.allocateDirect(SIZE);
    ((DirectBuffer) bb).cleaner().clean();
    

    我不明白他们为什么会公开gc()方法。即使在文档中,Java也非常清楚这种行为是不可预测的。医生说

    “调用gc方法表明Java虚拟机将精力花在回收未使用的对象上”

    也就是说,它可以做很多事情,包括什么都不做

    至于这个问题,很多应用程序服务器到处调用System.gc()。WebSphere是罪魁祸首,您可以在WAS/Portal代码库中找到它。我记得在开源库/框架中没有见过它。可能那些努力为这些框架做出贡献的人有足够的理由不使用行为不可定义的操作


    我的猜测是,当开发人员感到“在某些情况下,此操作可能会在处理过程中使用大量“临时”(短期)内存时,会调用它,因此我将进行一些垃圾收集以回收它”。您的RMI场景可能也是如此。在我看来,这是假的。在某些情况下,调用System.gc()会过早(不必要地)触发整个gc周期,从而降低性能。重要的是,垃圾收集器非常聪明,除非您确信自己知道得更好,否则不要试图弄乱它。

    JDK实现确切地知道它自己的
    System.gc()
    的行为。JDK不必假装是不可知论者,将自己限制在标准的抽象行为中,而不是具体的专有行为(这当然符合标准行为)

    是的,它可以根据需要调用
    System.gc()
    。我们不应该这样做。

    请注意,
    System.gc()
    只是对JVM的一个提示(“我希望您进行一些垃圾收集”),不必导致实际的垃圾收集。除此之外,如果JVM内存不足,它将自动收集数据。@Joachim Correct(现在感到惭愧)-修复了这个问题quickly@Thomas通常,System.gc()是一个非常丰富的“提示”,很可能会导致gc。JVM不会自动检测到“直接”内存不足,这就是为什么直接缓冲区实现会进行调用。有趣的是,如果使用直接缓冲区,DisableExplicitGC标志将变得非常危险。