在回收对象占用的内存之前,垃圾回收器会调用Finalize方法,该对象具有finalize()方法。这意味着你不知道什么时候最终确定对象。
为什么我们不知道垃圾收集器何时运行。 Java的创始人是否也不知道这一点。垃圾收集器运行时会有一个特定的条件或时间(确定)。
答案 0 :(得分:2)
为什么我们不知道垃圾收集器何时运行。
这是一个刻意的设计选择。这使得JVM可以灵活地一次(以某种方式)进行垃圾收集,从而提供最佳性能或最小暂停...取决于用户选择的收集器。
垃圾收集器运行时会有一个特定的条件或时间(确定)。
没有
唯一保证的是,在JVM决定放弃"放弃"之前,将运行完整的GC。并抛出一个OutOfMemoryError
。
有一个System.gc()
方法可以调用建议到JVM,它应该运行垃圾回收。但是:
允许JVM忽略该建议。
如果JVM注意到该建议,那么您的应用程序可能会比您让JVM决定更糟糕。在生产代码中调用System.gc()
几乎总是一个不好的想法。
最重要的是,如果您想保证某项行动发生,则不应使用终结者实施该行动。
答案 1 :(得分:0)
当垃圾收集完成后,执行过程会发生,但通常会在可用内存达到某个阈值以下时发生。
我记得听说允许实现根本没有垃圾收集!
如果不知道实施细节,然后监控GC正在监控的任何内容,您将无法确定收集何时发生。但即使这样也会出现问题而且非常气馁,因为它完全破坏了Java的可移植性。
方法System.gc
:
建议Java虚拟机花费精力来回收未使用的对象,以使其当前占用的内存可用于快速重用。当控制从方法调用返回时,Java虚拟机已尽最大努力从所有丢弃的对象中回收空间。
但是也不鼓励使用它。