eclipse的垃圾收集器是否与默认值不同?

时间:2010-05-12 11:44:24

标签: java eclipse garbage-collection

根据此处发布的问题以及我的旧问题,我发现您无法随时随地显式运行Java垃圾收集器。

如果你打电话,只需指示系统只要能够或认为合适就给它打电话。

但在eclipse中,如果按“运行垃圾收集器”按钮,您会看到内存使用量立即减少。怎么可能? eclipse是否使用不同的垃圾收集器,它是否可以访问我们没有的秘密API,或者我对GC的工作原理有何看法?

3 个答案:

答案 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徽标。