我刚遇到以下代码(略有简化):
/* 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,则将产生负面影响。
总而言之,除非有确凿的证据表明这种优化能够带来好处,并且每次程序发生重大变化时都需要重新评估这种证据,否则这种优化绝对是毫无意义的。