我们可以显式调用垃圾收集器? [重复](Can we call the Garbage Coll

2019-08-18 00:26发布

这个问题已经在这里有一个答案:

  • 为什么不好的做法,调用System.gc()? 13个回答

我的应用程序有很多重复的。 到现在为止我还没有遇到任何内存问题。 但是,从代码级我怀疑没有几个地方,这会导致内存泄漏和内存不足的问题。 我想手动调用垃圾收集器。 它是很好的做法手动调用垃圾收集器?

Answer 1:

您可以通过调用垃圾收集器:

System.gc();

但是,这并不意味着它会立即执行。 在JVM决定何时执行它。 一般来说,如果JVM即将抛出一个OutOfMemoryError ,调用System.gc()不会阻止它。 更好地调查你为什么要泄露这么多的内存和清理沿途。

JavaDoc的

调用gc方法表明Java虚拟机了一些努力,以使他们目前占据可快速重用的内存回收未使用的对象。 当从方法调用控制返回时,Java虚拟机已经从所有丢弃的对象中回收了空间尽力而为



Answer 2:

它是很好的做法手动调用垃圾收集器?

不,这绝对不是好的做法。

您可以使用System.gc() 请注意,这不能保证调用垃圾收集器 - 它只是给出了一个提示系统,这可能是一个好主意,做垃圾回收。

在Oracle的JVM的垃圾收集器包含了很多复杂的逻辑来确定何时以及如何清理。 调谐,需要关于它是如何工作的细节知识。 只是把一个System.gc()程序中的某个地方是不可能有很大的帮助,而事实上,它甚至可以使情况变得更糟。

见的Java SE 6 HotSpot虚拟机垃圾收集调如何调优垃圾收集与Java SE 6的细节。



Answer 3:

您可以显式调用垃圾收集器,但是JVM决定是否处理呼叫。 理想情况下, 你不应该写代码依赖于调用垃圾收集器。

JVM内部使用某种算法来决定何时拨打这个电话。 当您使用调用System.gc()的,它只是JVM和JVM 的要求可以随时决定忽略它。



Answer 4:

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

System.gc();

但是,什么情况是,你不能为了JVM立即做垃圾回收。 JVM自身决定何时垃圾collect.Hence它不是手动调用它的一个好主意。

另外对于OutOfMemoryException手工做垃圾回收不会帮助你防止例外,因为JVM抛出回收所有的内存,因此它在这之后例外。 它有一些非常复杂的算法来确定何时以及如何做进行垃圾回收。 所以,我的建议是,如果你正在OutOfMemoryException然后重新检查你的程序使之更有效率或增加堆空间。



Answer 5:

不管你是否可以或不可以手动触发垃圾收集器(和不同级别的集合),和什么样的影响这对性能(这的确是一个话题值得讨论 ),它不会阻止OutOfMemoryError异常,因为当JVM约用完的内存,但它确实是最彻底的集合它能反正。 只有经过该集合没有足够的内存可用,将它错误的。 即使你自己更早触发采集,结果(内存回收量)是相同的。

内存泄漏不能被更频繁地运行垃圾收集固定。

他们必须是固定在你的程序(停止引用的东西,你不再需要更早),或(最坏的情况下,如果它是一个“真正的”泄漏)在JVM或运行时库本身(但真正的内存管理错误不应该经过这么多年的服务)已经不复存在。



Answer 6:

调用System.gc()并不能保证任何GC。 如果有内存的实际需要垃圾收集。
你可以看看这里不同的垃圾收集器。
http://javarevisited.blogspot.in/2011/04/garbage-collection-in-java.html

您可以包括任何在命令行中,这些选区的PARAMS按您的需求。



文章来源: Can we call the Garbage Collector explicitly? [duplicate]