问题

我知道垃圾收集是用Java自动完成的。但我明白,如果你在代码中编写了System.gc(),Java VM可能会或可能不会在运行时决定在那时进行垃圾收集。这是如何工作的?在看到aSystem.gc()时,VM决定做什么(或不做)GC的确切基础/参数是什么?是否有可能的例子it一个好主意把它放在你的代码?


#1 热门回答(53 赞)

在实践中,它通常决定进行垃圾收集。答案取决于很多因素,例如你正在运行的JVM,它所处的模式以及它使用的垃圾收集算法。

我不会在你的代码中依赖它。如果JVM即将抛出OutOfMemoryError,则调用System.gc()将不会停止它,因为垃圾收集器将在它进入极端之前尝试尽可能多地释放它。我在实践中看到它的唯一一次是在IDE中,它附加到用户可以点击的按钮,但即便如此,它也不是非常有用。


#2 热门回答(28 赞)

我可以想到调用System.gc()的唯一示例是在分析应用程序以搜索可能的内存泄漏时。我相信分析器在获取内存快照之前调用此方法。


#3 热门回答(23 赞)

你无法控制java中的GC - VM决定。我从来没遇到需要System.gc()的情况。由于aSystem.gc()调用只是假设VM执行垃圾收集并且它还执行完全垃圾收集(在新一代堆中的新旧代),然后它实际上可能导致消耗超过必要的周期。

在某些情况下,向VM建议它现在进行完整收集可能是有意义的,因为你可能知道应用程序将在繁重的提升发生之前的几分钟内处于空闲状态。例如,在应用程序启动期间初始化大量临时对象之后(即,我刚刚缓存了一大堆信息,并且我知道我将在一分钟左右没有获得太多活动)。想象一下像eclipse这样的IDE启动 - 初始化它会做很多事情,所以也许在初始化之后立即进行完整的gc是有意义的。


原文链接