我需要知道Java中的垃圾收集器是单独工作还是我们需要启动它。
答案 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的垃圾收集器属性以选择低延迟收集器。调用System.gc()
不是在现代JVM中处理此问题的方法。
答案 5 :(得分:0)
我知道你必须调用System.gc()的唯一场合是你创建了很多Direct ByteBuffers。对于堆内存,OutOfMemoryError只会在Full GC之后发生,但对于直接内存,如果用完(即使可能有未引用的缓冲区),也不会调用GC,因此您可能必须先调用它再试一次。
我希望这是在未来的Java版本中修复的东西。