我们可以明确地调用垃圾收集器吗?

时间:2013-03-26 08:47:31

标签: java garbage-collection

我的应用程序有很多迭代。直到现在我还没有遇到任何内存问题。但是从代码级别我可以怀疑很少有地方会导致内存泄漏和内存不足问题。我正在考虑手动调用垃圾收集器。手动调用垃圾收集器是一种好习惯吗?

6 个答案:

答案 0 :(得分:27)

您可以使用以下方法调用垃圾收集器:

System.gc();

但这并不意味着它会立即执行。 JVM决定何时执行它。通常,如果JVM即将抛出OutOfMemoryError,则调用System.gc()不会阻止它。更好地调查为什么你会在这个过程中泄漏如此多的内存并进行清理。

<强>的JavaDoc

  

调用gc方法表明Java虚拟机耗费   努力回收未使用的物体以制造记忆   它们目前可用于快速重复使用。当控制返回时   从方法调用中,Java虚拟机已尽最大努力   从所有废弃物体中回收空间

答案 1 :(得分:7)

  

手动调用垃圾收集器是一种好习惯吗?

不,这绝对不是一个好习惯。

您可以使用System.gc()。请注意,这不能保证调用垃圾收集器 - 它只向系统提示可能最好进行垃圾收集。

Oracle JVM中的垃圾收集器包含许多复杂的逻辑,用于确定清理的时间和内容。调整它需要了解其工作原理的细节。只是在你的程序中放置一个System.gc()可能不会有太大帮助,事实上,它甚至可以使它变得更糟。

有关如何使用Java SE 6调整垃圾收集的详细信息,请参阅Java SE 6 HotSpot Virtual Machine Garbage Collection Tuning

答案 2 :(得分:6)

您可以显式调用Garbage Collector,但JVM决定是否处理该调用。 理想情况下,您永远不应该根据对垃圾收集器的调用来编写代码。

JVM内部使用一些算法来决定何时进行此调用。当您使用 System.gc()进行调用时,它只是对JVM的请求,JVM可以随时决定忽略它。

答案 3 :(得分:5)

是的,您可以使用

显式调用垃圾收集器
System.gc();

但是发生的事情是你不能命令JVM立即进行垃圾收集。 JVM自行决定何时进行垃圾收集。这不是手动调用它的好主意。

此外,关于OutOfMemoryException进行手动垃圾收集无法帮助您防止异常,因为JVM在回收所有内存后会抛出此异常。它有一些非常复杂的算法来确定何时以及如何执行垃圾收集。 所以我建议如果你得到OutOfMemoryException,那么重新检查你的程序,使它更有效率或增加堆空间。

答案 4 :(得分:3)

无论您是否可以手动触发垃圾收集器(以及不同级别的收集),以及它对性能(确实是a topic worth discussion)的影响,它都不会阻止OutOfMemoryErrors,因为JVM即将耗尽内存,无论如何它都可以进行最彻底的收集。只有在该集合之后没有足够的内存可用时,它才会出错。即使您自己更早地触发了集合,结果(回收的内存量)也是相同的。

通过更频繁地运行垃圾收集无法修复内存泄漏。

它们必须在您的程序中修复(停止引用您之前不再需要的东西),或者(最坏的情况,如果它是“真正的”泄漏)在JVM或运行时库本身(但是真正的内存管理)经过这么多年的服务,错误不再存在了。)

答案 5 :(得分:2)

调用System.gc()不保证任何GC。如果确实需要记忆,则收集垃​​圾 你可以在这里看看不同的垃圾收集者 http://javarevisited.blogspot.in/2011/04/garbage-collection-in-java.html

您可以根据需要在命令行参数中包含任何这些GC。