根据此处发布的问题以及我的旧问题,我发现您无法随时随地显式运行Java垃圾收集器。
如果你打电话,只需指示系统只要能够或认为合适就给它打电话。
但在eclipse中,如果按“运行垃圾收集器”按钮,您会看到内存使用量立即减少。怎么可能? eclipse是否使用不同的垃圾收集器,它是否可以访问我们没有的秘密API,或者我对GC的工作原理有何看法?
答案 0 :(得分:6)
“普通”Java程序无法强制垃圾收集器运行。但是,使用Java Virtual Machine Tool Interface(JVMTI,用于将调试器连接到JVM的API),可以强制进行垃圾回收。
我不知道Eclipse是否只调用System.gc()
(它不会强制垃圾收集),或者它是否使用JVMTI API来强制GC运行。
使用JVisualVM(包含在Sun JDK 6中),您可以连接到其他正在运行的Java进程,然后按一个按钮在这些进程中运行垃圾收集器。
答案 1 :(得分:3)
你不能告诉 GC运行,而you can ask it to使用System.gc()
。
我怀疑Eclipse只是调用它,而且很多时候,GC决定做某事。
答案 2 :(得分:2)
Eclipse调用System.gc()
。 System.gc()
不会强制垃圾收集,它只是指示JVM尝试一下。 JVM可以自由地忽略它。但是,实际上,Sun的JVM的默认行为是在调用System.gc()
时运行GC。
请注意以下事项:
可以使用-XX:-DisableExplicitGC
命令行标志启动Sun的JVM。使用此标志,System.gc()
变为无操作。 VM在适当的时候仍会运行GC,但它会忽略对System.gc()
的任何显式调用。
强制GC运行,无论您如何操作,都不是一个好主意。 GC针对正在运行的应用程序代码的一些启发式近似进行了优化(其中大多数处理缓存局部性的复杂但关键的问题),并且对GC的显式调用不是这些启发式的一部分。强制性的GC运行通常是一种减慢速度的复杂方法。
也许我应该称它为Oracle的JVM? Oracle收购了Sun,所有Java页面现在都有Oracle徽标。