2013-08-18 90 views
-1

在收回由具有finalize()方法的对象占用的内存之前,垃圾回收器调用Finalize方法。这意味着你不知道对象什么时候会被完成。执行Java垃圾收集器

为什么我们不知道垃圾回收器何时运行。 Java的创始人也不知道这一点。当垃圾收集器运行时会有一个特定的条件或时间(肯定)。

回答

0

垃圾回收完成后就会执行,但通常会在可用内存达到某个阈值以下时发生。

我记得听说允许一个实现没有垃圾回收!

在不知道实现细节的情况下收集会发生的时间,然后监控GC正在监控的任何内容,您将无法确定。但即使这样也会出现问题,因为它完全破坏了Java的可移植性,所以非常沮丧。

的是一个方法System.gc其中:

表明Java虚拟机了一些努力,以使他们目前占据可快速重用的内存回收未使用的对象。当控制从方法调用返回时,Java虚拟机已尽最大努力从所有被丢弃的对象中回收空间。

然而,这种使用也是不鼓励的。

2

为什么我们不知道垃圾回收器何时运行。

这是一个故意的设计选择。这使JVM能够灵活地一次性(以某种方式)执行垃圾回收,从而提供最佳性能或最少暂停......取决于用户选择的收集器。

当垃圾收集器运行时,会有一个特定的条件或时间(肯定)。

,这是相当多保障的唯一编号就是JVM决定“放弃”,并抛出一个OutOfMemoryError前一个完整的GC将运行。

有一个System.gc()方法,你可以调用建议到JVM它应该运行垃圾回收。但是:

  • 允许JVM忽略该建议。

  • 如果JVM注意到这个建议,那么你的应用程序很可能比只让JVM做出决定更糟。在生产代码中调用System.gc()几乎总是一个糟糕的想法。


底线是,如果你想保证一定的动作发生,你不应该使用finaliser执行该操作。

+0

+1我想补充的是,在终结器中运行的代码抛出的任何异常都会被吞噬,代码将无声无息地死去,导致很难发现错误。 –