2010-03-03 69 views
6

当对象被引用时,垃圾收集会自动调用,不再可用于任何变量。但是我喜欢知道为什么当垃圾收集被自动调用时,我们明确地调用System.gc()。当我们调用System.gc();关于垃圾收集。为什么我们需要调用System.gc();?

+0

你不应该调用System.gc()。你为什么认为你需要给它打电话? – 2010-03-03 21:19:14

回答

6

我们没有。

我们不这样做。

也许我的经验是有限的,但我有不是一次发现有必要调用System.gc()。

我将引用Brian Goetz在性能方面(如果你还没有听说过他,看他 - 和阅读这篇文章的其余部分,太):

第三类,开发人员经常错误地认为他们正在帮助垃圾收集器使用System.gc(),这会触发垃圾收集(实际上,它仅仅表明这可能是垃圾收集的好时机)。不幸的是,System.gc()触发了一个完整的集合,其中包括跟踪堆中的所有活动对象并清理和压缩老一代。这可能是很多工作。

一般来说,最好让系统决定何时需要收集堆以及是否进行完整收集。

10

你不知道。正如你所说,垃圾收集是自动的。 System.gc()甚至不强制垃圾收集;这只是提示JVM“现在可能是清理一下的好时机”

一般来说,试图强制垃圾回收器使用System.gc()来做你想做的事情是一种破解认为自己比实际做得更好的人,或者作为破解代码的(企图)解决方法。

我已经多年编写Java,我还没有看到的情况下调用System.gc真的做正确的事(在什么我已经写了)

+0

我见过有缺陷的代码,实际上System.gc()运行速度较慢,开发人员认为他们知道的更好。 – 2010-03-03 18:18:36

+0

JVM的某些实现(主要用于嵌入式/低端硬件)承诺在System.gc()被调用时进行垃圾收集。你仍然不应该需要这个。 – Thirler 2010-03-03 18:25:24

+0

许多垃圾收集算法会中断你的程序,阻止所有线程的执行,直到收割完成。过多地调用System.gc()会严重伤害性能,并且(几乎)总是不必要的。 – Matthew 2010-03-03 18:25:57

1

你不需要它。把它看作是一个诊断工具,就像能够写入调试控制台一样。

例如,想象一下,如果您正在进行基准测试,您会希望告诉GC在每次基准测试运行后收集垃圾。

1

需要它。无论这些人说些什么,这都非常有用。

用法示例: 假设您刚刚完成了使用大量内存的长时间后台任务。这些对象都不会再被使用。由于任务花了很长时间,用户不会在意5-10秒。这个垃圾收集的好时机。

如果你不是 GC在那一点,它将在稍后发生。可能在交互式使用该程序的过程中,用户体验变得不稳定。