Java中的垃圾收集器是否自动运行?

时间:2010-06-18 06:18:47

标签: java garbage-collection

我需要知道Java中的垃圾收集器是单独工作还是我们需要启动它。

6 个答案:

答案 0 :(得分:4)

它独立运作。你可以“建议”它运行,但就是这样。

答案 1 :(得分:2)

GC是一个从JVM开始的deamon线程,在JVM结束时结束(如果不存在更多非deamon线程,则JVM停止)。

它在后台运行,并在需要时启动。 JVM决定它何时运行,您可以“请求”它与System.gc()一起运行。

但是我应该提一下,你不能编写你的代码来依赖GC来运行(Java中的终结器不像C ++中的析构函数)。人们倾向于在GC上投入太多,然后忘掉它,这是一个禁忌,导致内存泄漏,很难找到错误。

你可以指望的是,在你获得java.lang.OutOfMemoryError之前,GC已经开始行动并且做到了最好。

答案 2 :(得分:1)

它根据优化算法自行工作以获得最佳性能。您可以执行强制垃圾回收,但不建议这样做,因为它可以阻止正常的垃圾收集模式,从而降低实际性能。

您应该阅读相关主题的this Old SO Discussion

答案 3 :(得分:0)

是的,垃圾收集由Java自动处理。 当任何变量不再引用对象时,Java会自动回收该对象使用的内存。这称为垃圾收集。 仍然是方法  可以使用System.gc()方法明确调用它。

答案 4 :(得分:0)

(这可能只是重复其他答案试图说的......但是,值得说明这些明确。)

Java垃圾收集器根据需要自动运行,无需启动它。

应用程序可以调用请求的静态方法(System.gc())垃圾收集器“现在”运行。但是:

  • 可以将JVM配置为不关注此请求。
  • 提出此请求通常是坏主意,因为它会显着降低垃圾收集器的性能。一般来说,运行垃圾收集器的最佳时间是在收集大量垃圾时,只有JVM知道可能的时间。

编辑 - 解决大型垃圾收集延迟问题的方法是更改​​JVM的垃圾收集器属性以选择低延迟收集器。调用System.gc()不是在现代JVM中处理此问题的方法。

答案 5 :(得分:0)

我知道你必须调用System.gc()的唯一场合是你创建了很多Direct ByteBuffers。对于堆内存,OutOfMemoryError只会在Full GC之后发生,但对于直接内存,如果用完(即使可能有未引用的缓冲区),也不会调用GC,因此您可能必须先调用它再试一次。

我希望这是在未来的Java版本中修复的东西。