为什么JVM的设计方式不允许强制垃圾回收?[已关闭]

2022-09-04 19:50:52

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


答案 1

强制垃圾回收效率低下,并且在大多数情况下是不必要的1 ...如果你已经正确地编写了你的程序。

参考:

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

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


至于你的问题:

为什么 JVM 的设计方式不支持强制垃圾回收?

这样就可以保护JVM免受编写不良代码对性能的影响;例如,在小程序,插件,第三方库等中。

(我想,部分原因是最初的Sun工程师有点厌倦了人们抱怨“Java很慢”,而真正的问题是不必要的调用......System.gc()


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


答案 2

Java的设计使得(与C++不同)您不必担心回收废弃的内存。如果运行时内存配置正确,则无需担心垃圾回收。话虽如此,做一个gc()通常会引发年轻一代空间的席卷。