Java 是日食';垃圾收集器与默认的不同?
从这里发布的问题和我的一个老问题中,我产生了一种印象,即您不能在任何时候都显式地运行Java垃圾收集器 如果您调用它,您只需指示系统在任何可能或认为合适的时候调用它 但是在eclipse中,如果您按下“运行垃圾收集器”按钮,您会看到内存使用量立即减少。这怎么可能?eclipse使用的是不同的垃圾收集器吗?它是否可以访问一些我们不知道的秘密API?或者是我对GC工作原理的理解有误吗?您不能告诉GC运行,但是,使用Java 是日食';垃圾收集器与默认的不同?,java,eclipse,garbage-collection,Java,Eclipse,Garbage Collection,从这里发布的问题和我的一个老问题中,我产生了一种印象,即您不能在任何时候都显式地运行Java垃圾收集器 如果您调用它,您只需指示系统在任何可能或认为合适的时候调用它 但是在eclipse中,如果您按下“运行垃圾收集器”按钮,您会看到内存使用量立即减少。这怎么可能?eclipse使用的是不同的垃圾收集器吗?它是否可以访问一些我们不知道的秘密API?或者是我对GC工作原理的理解有误吗?您不能告诉GC运行,但是,使用System.GC() 我怀疑Eclipse只是调用了它,而且大多数时候,GC决定做一
System.GC()
我怀疑Eclipse只是调用了它,而且大多数时候,GC决定做一些事情。一个“普通”Java程序无法强制垃圾收集器运行。但是,使用(JVMTI,一种用于将调试器连接到JVM的API)可以强制进行垃圾收集
我不知道Eclipse是否只是调用System.gc()
(它不强制垃圾收集),或者它是否使用JVMTIAPI真正强制gc运行
使用(Sun JDK 6附带的),您可以连接到其他正在运行的Java进程,并按下按钮在这些进程中运行垃圾收集器。Eclipse调用
System.gc()
System.gc()
不强制垃圾收集,它只是指示JVM尝试一下。JVM可以随意忽略它。然而,实际上,Sun JVM的默认行为是在调用System.GC()
时运行GC
请注意以下事项:
- Sun的JVM可以使用
命令行标志启动。有了这个标志,-XX:-DisableExplicitGC
就变成了一个no操作。在适当的时候,VM仍将操作GC,但它将忽略对System.gc()
的任何显式调用System.GC()
- 无论您如何执行,强制GC运行都不是一个好主意。GC根据运行的应用程序代码的一些启发式近似值进行优化(其中大多数处理复杂但关键的缓存位置问题),并且对GC的显式调用不是这些启发式的一部分。强制GC运行通常被证明是一种复杂的减慢速度的方法
- 也许我应该称之为Oracle的JVM?Oracle收购了Sun,所有Java页面现在到处都有Oracle徽标