为什么 JVM 的设计方式不允许强制垃圾收集?

Why JVM is designed in a way that it does not allow force Garbage Collection?

据我所知,我们无法在 JAVA 中强制执行垃圾回收。我们能做的最好的事情就是通过调用 System.gc()Runtime.gc() 来发送请求。这样做会向 JVM 发送垃圾收集请求,但不能保证垃圾收集会发生。所以我的问题是:是否有任何特殊原因,为什么 JVM 的设计方式不支持强制垃圾收集?

Java 的设计目的是(与 C++ 不同)您不必担心回收废弃的内存。如果运行时内存配置正确,您应该不需要关心垃圾收集。话虽如此,做一个gc()一般都会触发对年轻代的扫荡space.

强制垃圾收集效率低下,在大多数情况下是不必要的1 ... 如果您正确编写了程序。

参考:

  • Why is it bad practice to call System.gc()?

事实证明,如果您控制将 运行 您的应用程序(或 applet 或 servlet 或其他)的 JVM 的启动,那么您可以确保调用 System.gc() 将 运行 GC。或者至少,Sun / Oracle JVM 就是这种情况......其中的行为是通过 java 命令上的 -XX 选项控制的。

javadoc 的要点是它依赖于平台,可移植应用程序不能依赖它。


关于您的问题:

WHY JVM is designed in a way that it doesn't support Force Garbage Collection?

这样可以保护 JVM 免受编写错误代码的性能影响;例如在小程序、插件、第 3 方库等中

(我想,部分原因是最初的 Sun 工程师对人们抱怨 "Java is slow" 感到有点厌烦,而真正的问题是对 System.gc() 的不必要调用 ...)


1 - 但并非总是如此。例如,在方便的时候调用 System.gc() 可以避免在不方便的时候发生与 GC 相关的暂停。但是,如果您的代码仅在您 运行 GC 在某些点上有效,那么您就做错了。