我刚刚遇到以下代码(略微简化):
/* 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应用程序中运行。
答案 0 :(得分:4)
我也同意你的假设。如果这真的是一个优化,它将在JVM中找到它的方式。应该避免调用垃圾收集器 - 它甚至可能产生负面影响(因为你“干扰”JVM)
JVM可能会设置gc间隔。对于Sun来说,See here。而硬编码的价值对于任何事情都是值得怀疑的,尤其是垃圾收集。
答案 1 :(得分:4)
取决于。
JVM可以完全忽略System.gc()
,因此这段代码绝对不能做任何事情。
其次,GC会对成本产生影响。如果你的程序本来不会做GC(比如,它不会产生很多垃圾,或者它有一个巨大的堆而且从不需要GC)那么这个代码将增加开销。
如果程序通常仅使用较小的GC运行,并且此代码会导致主要GC,则会产生负面影响。
总而言之,这种优化绝对没有任何意义,除非你有具体的证据证明它提供了好处,而且你需要在每次计划实质性改变时重新评估这些证据。
答案 2 :(得分:1)
也许如果您的应用程序可以对调用进行计时,以便在应用程序没有任何有用的事情发生GC时,这可能是一件好事,因此每当下一个加载峰值时内存都是干净的谈到。但这不是这个循环所做的(它只是运行所有5分钟),所以我建议反对它。
但我邀请您进行测试 - 使用和不使用此循环运行应用程序以获得类似的工作量并测量哪些需要更多时间(如果重要的话,可能需要总内存)。有时重复测试。也许我们会得到一些令人惊讶的见解。