代码之家  ›  专栏  ›  技术社区  ›  Andrei Ciobanu

Java面试问题:FialLeIZE()方法

  •  29
  • Andrei Ciobanu  · 技术社区  · 16 年前

    在一次采访中,我得到了以下短语:

    对象的调用 finalize()方法是最后一件事 在一个物体 收集垃圾。

    我必须回答:

    我选择了 True 但这是错误的。 你能解释一下为什么吗?

    6 回复  |  直到 11 年前
        1
  •  59
  •   SaraNa Daniel Rikowski    12 年前

    顺序不同:

    1. 弗斯特 对象是 收集 .
    2. 然后 对象是 定稿 .

    http://java.dzone.com/articles/ocajp-7-object-lifecycle-java

    对象生命周期:

    1. 创建
    2. 正在使用中(可强烈访问)
    3. 隐形的
    4. 不可达
    5. 收集
    6. 定稿
    7. 解除分配的
        2
  •  8
  •   bakkal    16 年前

    我认为它暗示了这样一个事实:在GC真正丢弃对象之前,实际上还有其他事情可以对该对象进行/发生。

    引用参考文献:

    […]Finalize方法可以采用 动作,包括使此对象 可再次用于其他线程 ;最终确定的通常目的, 但是,是执行清理操作 在物体被不可撤销地丢弃之前 . 例如,完成 表示的对象的方法 输入/输出连接可能 对执行显式I/O事务 断开连接 之前 对象是永久的 丢弃的。 […]

    因此,在GC丢弃它之前,最终确定过程并不是最后一件事。

        3
  •  2
  •   Jesper    16 年前

    不能保证 finalize() 将始终被调用,甚至垃圾收集也将运行。

    假设您的程序结束(通过调用 System.exit() 或者当所有正在运行的线程都到达它们的末尾时),那么JVM将退出,它将不会清除所有内容并调用 终结() 在所有对象上。

    因此,将必须在 终结() 方法不是一个好主意。

        4
  •  2
  •   rsp    16 年前

    我想你可以为这两个答案辩护, finalize() 是由垃圾收集器在收集对象之前调用的,但您不能确定在应用程序结束之前会发生这种情况。并非所有可以称为垃圾收集的对象都必须进行汇总。你可能永远不会依赖 终结() 要为任何对象调用的方法。

        5
  •  1
  •   Community Mohan Dere    9 年前

    命令是错误的,因为 DR 已经显示出来了。

    对象将其状态更改为 收集 当GC识别到对象不可访问时。

    所以 是否应在检测到此“不可访问”条件之前采取操作完成对象?实际上,是垃圾收集器将收集的对象标记为完成(如果对象Finalize方法被重写)。我们真的不想最终确定仍然可以访问的对象,例如“正在使用”。

    不管怎样,这个问题很好,因为你倾向于说“是的,这是真的”。

        6
  •  0
  •   RoHaN    11 年前

    通过指向finalize方法,可以在finalize方法中恢复该对象,这样在调用finalized方法之后,GC可能不会收集该对象。但当对象再次可用于垃圾收集时,它不会调用该对象的finished方法,因为它已被标记/标记为finished。因此,在GC发生之前,调用finalize方法或对象可以恢复。

    推荐文章