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

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

您可以使用以下命令调用Garbage collector:

System.gc(); 

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

JavaDoc

调用gc方法表明Java虚拟机花费了很多精力来回收未使用的对象,以便使它们当前占用的内存可用于快速重用。 当控制从方法调用返回时,Java虚拟机已尽最大努力从所有丢弃的对象中回收空间

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

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

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

Oracle JVM中的垃圾收集器包含许多复杂的逻辑,用于确定清理的时间和内容。 调整它需要有关其工作原理的详细信息。 只需将System.gc()放在程序中的某个位置就不太可能有所帮助,事实上,它甚至可能使情况变得更糟。

有关如何使用Java SE 6调整垃圾回收的详细信息,请参阅Java SE 6 HotSpot虚拟机垃圾收集调整 。

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

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

是的,您可以使用显式调用垃圾收集器

 System.gc(); 

但是,您无法立即命令JVM进行垃圾收集。 JVM自行决定何时进行垃圾收集。因此,手动调用它并不是一个好主意。

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

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

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

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

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

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