在一次采访中,我得到了以下短语:
对象的 finalize() 方法的调用是对象被垃圾回收之前发生的最后一件事。
我不得不回答:
- 真的
- 错误的
我选择True
了,但它是错误的。你能解释一下为什么吗?
在一次采访中,我得到了以下短语:
对象的 finalize() 方法的调用是对象被垃圾回收之前发生的最后一件事。
我不得不回答:
我选择True
了,但它是错误的。你能解释一下为什么吗?
顺序不同:
见http://java.dzone.com/articles/ocajp-7-object-lifecycle-java
对象生命周期:
- 已创建
- 使用中(强可达)
- 无形的
- 无法到达
- 集
- 定稿
- 解除分配
我认为这暗示了在 GC 真正丢弃它之前,实际上还有其他事情可以完成/发生在对象上。
引用参考:
[...]finalize 方法可以采取任何行动,包括使该对象 再次可供其他线程使用;然而,finalize 的通常目的是 在对象被不可撤销地丢弃之前执行清理操作。例如,代表输入/输出连接的对象的 finalize 方法可能会执行显式 I/O 事务以在对象被永久丢弃之前中断连接。[...]
因此,从这个角度来看,最终确定过程并不是 GC 丢弃它之前的最后一件事。
不能保证finalize()
总是会调用它,甚至不能保证垃圾收集会运行。
假设您的程序结束(通过调用System.exit()
或所有正在运行的线程结束时),那么 JVM 将退出,它不会清理所有内容并调用finalize()
所有对象。
因此,将绝对必须运行的清理任务放在一个finalize()
方法中并不是一个好主意。
我想你可以为这两个答案辩护,finalize()
垃圾收集器在收集对象之前调用它,但你不能确定在应用程序结束之前会出现这种情况。并非所有可以被认为是垃圾收集的对象都必须被收集。您可能永远不会依赖finalize()
为任何对象调用的方法。
正如DR已经表明的那样,命令是错误的。
当 gc 识别出对象不可达时,对象将其状态更改为已收集。
那么在检测到这种“无法到达”的情况之前,谁应该采取行动来完成一个对象呢?事实上,垃圾收集器将收集到的对象标记为终结(如果对象终结方法被覆盖)。而且我们真的不想最终确定仍然可以访问的对象,例如“正在使用”。
无论如何,这是个好问题,因为您倾向于说“是的,这是真的”。
You can resurrect the object in the finalize method by making something point to it so the object may not be collected by the GC after calling finalized method. but when the object again becomes available for garbage collection it wont call the finalized method of that object as it has been marked/flagged as finalized. so before GC it may happen the call finalize method or the object can resurrect.