2011-02-26 75 views
1

我正好遇到下面的代码(略简体):定期垃圾收集是否有助于JVM的性能?

/* periodically requests garbagecollect to improve memory usage and 
    garbage collect performance under most JVMs */ 
static class GCThread implements Runnable { 
    public void run() { 
     while(true) { 
      try { 
       Thread.sleep(300000); 
      } catch (InterruptedException e) {} 
      System.gc();   
     } 
    } 
} 

Thread gcThread = new Thread(new GCThread()); 
gcThread.setDaemon(true); 
gcThread.start(); 

我尊重代码作者,但不再具有方便地访问,请他捍卫他的主张在顶部的评论。

这是真的吗?与我的直觉相反,这个小小的黑客应该改进任何东西。我希望JVM有更好的装备来决定何时执行一个集合。

代码运行在Z/OS上的IBM WebSphere内部运行的Web应用程序中。

+2

我非常怀疑这一点。把代码拿出来,让作者在基准测试中显示出来,然后再把它放回去。 – delnan 2011-02-26 20:54:22

+0

无论如何RMI会定期调用GC(如果未收到次要的集合) – 2011-02-27 00:17:20

回答

4

这取决于。

  1. JVM可以完全忽略System.gc(),所以这段代码完全没有办法。

  2. 其次,GC对成本有影响。如果你的程序不会做GC(比如说它不会产生太多垃圾,或者它有很大的堆并且从不需要GC),那么这个代码将会增加开销。

  3. 如果程序通常只运行较小的GC并且此代码导致主要的GC,则会产生负面影响。

总而言之,这种优化使绝对没有任何意义,除非你有具体的证据,它提供的好处,你就需要重新评估证据每次程序重大变动的时间。

4

我也分享你的假设。如果这真的是一个优化,它将在JVM中找到它的方式。应该避免调用垃圾回收器 - 它甚至可能会产生负面影响(因为您正在“干扰”JVM)

JVMs可能会有一个gc interval设置。对于Sun的See here。对于任何事情来说,硬编码的价值都是值得怀疑的,特别是对于垃圾收集。

1

也许这可能是一件好事,如果你的应用程序可以一次通话所以当应用程序有没有什么有用的事,所以每当下一个负荷高峰期来临时内存是干净的是GC将发生在倍。但这不是这个循环所做的(它只运行所有5分钟),所以我会建议反对它。

但是我邀请你去测试它 - 运行应用程序时使用和不使用此循环的类似工作量和需要更多时间的测量(如果重要的话可能需要更多的内存)。重复测试几次。也许我们得到一些令人惊讶的见解。

+1

System.gc可能会涉及停止世界做法。我绝不会建议任何人直接调用它(我确实会争论这个调用,但是不要直接调用它,除非需要通过finalize来释放一些资源) – bestsss 2011-02-26 23:15:52