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

13 java garbage-collection

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

Gok*_* KP 28

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

System.gc();
Run Code Online (Sandbox Code Playgroud)

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

JavaDoc:

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

  • +1我还要补充说,调用System.gc实际上会降低应用程序的性能 (9认同)
  • 我想有一个调用`System.gc()`*有用的案例列表会很好.一种情况是在调试/开发(非生产)期间尝试估计内存使用情况.另一种情况是在开发过程中再次调用终结器,分析内存泄漏的不可靠尝试. (3认同)

Jes*_*per 7

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

不,这绝对不是好习惯.

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

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

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

  • *不,这绝对不是一个好习惯.*我不同意,如果你知道你为什么叫它,那就没关系了.不过,这适用于某些监控代码.我将给出一个调用MappedByteBuffer.map的示例,您需要将其最终确定并且唯一的非hack选项确实涉及GC. (4认同)

Ank*_*hag 6

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

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


kay*_*ush 5

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

System.gc();
Run Code Online (Sandbox Code Playgroud)

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

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