我刚遇到以下代码(略有简化):

/* 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应用程序中运行。

最佳答案

这取决于。


JVM可以完全忽略System.gc(),因此此代码绝对无法执行任何操作。
其次,GC具有成本影响。如果您的程序不执行GC(例如,它不会产生大量垃圾,或者具有巨大的堆并且永远不需要GC),则此代码将增加开销。
如果该程序通常仅在次要GC上运行,并且此代码导致了主GC,则将产生负面影响。


总而言之,除非有确凿的证据表明这种优化能够带来好处,并且每次程序发生重大变化时都需要重新评估这种证据,否则这种优化绝对是毫无意义的。

10-02 10:51