Java 关于垃圾收集。为什么我们需要调用System.gc();?

Java 关于垃圾收集。为什么我们需要调用System.gc();?,java,garbage-collection,Java,Garbage Collection,当引用的对象不再对任何变量可用时,将自动调用垃圾回收。但我想知道,当垃圾收集被自动调用时,为什么我们要使用System.gc()显式调用 我们没有 我们就是没有 也许我的经验有限,但我从未发现有必要调用System.gc() 我将引用性能方面的内容(如果您没有听说过他,请查找他,并阅读本文的其余部分): 开发人员经常错误地认为他们在帮助垃圾收集器的第三类是使用System.gc(),这会触发垃圾收集(实际上,它只是暗示这可能是垃圾收集的好时机)。不幸的是,System.gc()触发了一个完整的集

当引用的对象不再对任何变量可用时,将自动调用垃圾回收。但我想知道,当垃圾收集被自动调用时,为什么我们要使用System.gc()显式调用

我们没有

我们就是没有

也许我的经验有限,但我从未发现有必要调用System.gc()

我将引用性能方面的内容(如果您没有听说过他,请查找他,并阅读本文的其余部分):

开发人员经常错误地认为他们在帮助垃圾收集器的第三类是使用
System.gc()
,这会触发垃圾收集(实际上,它只是暗示这可能是垃圾收集的好时机)。不幸的是,
System.gc()
触发了一个完整的集合,其中包括跟踪堆中的所有活动对象,以及扫描和压缩旧的一代。这可能需要很多工作

通常,最好让系统决定何时需要收集堆,以及是否进行完整收集


你没有。正如您所说,垃圾收集是自动的。gc()甚至不强制垃圾收集;这只是对JVM的一个提示,“现在可能是清理一下的好时机”

一般来说,试图强迫垃圾回收器对System.gc()执行您想要的操作是一种黑客行为,这种行为被认为比实际情况更了解垃圾回收器,或者被用作(试图)解决坏代码的方法


我已经编写Java多年了,我还没有看到调用System.gc是正确的做法(在我所写的任何东西中)

您不需要它。将其视为诊断工具,就像能够写入调试控制台一样

例如,假设您正在进行基准测试,您希望在每次基准测试运行后告诉GC收集垃圾。

您确实需要它。不管别人说什么,它都是非常有用的

用法示例: 假设您刚刚完成了一项占用大量内存的长时间后台任务。这些对象都不会被再次使用。由于任务花费了很长时间,用户不会再关心5-10秒。这是垃圾收集的好时机


如果你在那一点上没有GC,它将在以后发生。可能是在交互使用程序的过程中,此时用户体验会变得不稳定。

我看到有缺陷的代码在System.gc()上运行得比较慢,因为开发人员认为他们更了解。JVM的一些实现(主要用于嵌入式/低端硬件)承诺在调用System.gc()时会进行垃圾收集。但是你永远不应该需要它。许多垃圾收集算法会中断你的程序,阻塞所有线程的执行,直到收获完成。过于频繁地调用
System.gc()
会严重影响性能,而且(几乎)总是没有必要的。您永远不应该调用System.gc()。你为什么认为你需要给它打电话?