2011-02-26 57 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