当引用对象时,自动调用垃圾收集对任何变量都不再可用。但我想知道为什么在自动调用垃圾收集时我们使用System.gc()显式调用。何时调用System.gc();
答案 0 :(得分:10)
你没有。如你所说,垃圾收集是自动的。 System.gc()甚至不强制垃圾收集;它只是对JVM的暗示“现在可能是清理一下的好时机”
一般情况下,尝试强制垃圾收集器使用System.gc()执行您想要的操作是由那些认为他们比实际知道更好的人应用的黑客,或者是破坏代码的(尝试)解决方法。
我多年来一直在编写Java,而且我还没有看到调用System.gc真正做的事情(在我编写的任何内容中)
答案 1 :(得分:6)
我们没有。
我们没有。
也许我的经验有限,但我没有认为有必要调用System.gc()。
我会在表演方面引用Brian Goetz(如果你没有听过他,请看他 - 并阅读本文的其余内容):
开发人员经常错误地认为他们正在帮助垃圾收集器的第三类是使用
System.gc()
,这会触发垃圾收集(实际上,它只是表明这可能是垃圾收集的好时机) 。不幸的是,System.gc()
触发了一个完整的集合,其中包括跟踪堆中的所有活动对象以及扫描和压缩旧代。这可能是很多工作。通常,最好让系统决定何时需要收集堆,以及是否进行完整收集。
答案 2 :(得分:1)
你不需要它。可以将其视为一种诊断工具,例如能够写入调试控制台。
例如,假设您正在进行基准测试,您可能希望告知GC在每次基准测试运行后收集垃圾。
答案 3 :(得分:1)
你做需要它。无论其他人说什么,它都非常有用。
一个用法示例: 假设您刚刚完成了一项耗费大量内存的漫长后台任务。这些对象都不会再次使用。由于任务需要很长时间,因此用户不会再关心5-10秒。这个 是垃圾收集的好时机。
如果此时不 GC,则会在以后发生。可能在交互式使用程序期间,用户体验会变得不稳定。