【发布时间】:2023-03-12 13:24:02
【问题描述】:
我正在阅读有关 finalize() 方法并且很好奇:
finalize 中清理对象(将其设置为 NULL)和从内存中删除对象的任务有什么区别?
【问题讨论】:
-
这是什么语言?请正确标记问题。
-
重新标记为 Java,因为 finalize 是 Java GC 方法
我正在阅读有关 finalize() 方法并且很好奇:
finalize 中清理对象(将其设置为 NULL)和从内存中删除对象的任务有什么区别?
【问题讨论】:
清理对象的任务有什么区别( 在 finalize 中将它们设置为 NULL )
设置为 null 会删除对对象的 ONE 引用。 如果 NO 存在对某个对象的更多引用,则允许(非必需)垃圾收集器删除该对象
并从内存中删除一个对象?
在 java 中没有明确的方式来移除(销毁、删除)一个对象。 垃圾收集器会在他喜欢的时候做。 尤其是从删除最后一个引用到删除/销毁对象的时间是不确定的
NO需要在finalize方法中设置对null的引用。 当垃圾收集器调用 finalize 时,对象及其引用很快就会消失。
在我很长的 Java 经验中,我从未编写过自己的 finalize 方法。
如果您的对象正在处理 os-resources,那么编写自己的 finalize 方法是有意义的罕见情况。但是,通常您使用标准包进行操作系统访问
【讨论】:
finalize 方法中执行 anything 会极大地减慢 GC。 Effective Java 引用了一个基准,表明垃圾收集速度降低了 430 倍——是的,这超过了两个数量级。
当您将对象设置为null 时,您不会“清理”对象,您只是将引用设置为 null,请考虑:
Object a = new Object();
Object b = a;
a = null;
System.out.println(b);
一旦对象丢失所有引用,它将在下一次 GC 传递时被收集。 Finalize 是一个在发生这种情况时被调用的方法,您应该避免使用它。
只是不要保留额外的引用,让 GC 完成它的工作。
【讨论】:
finalize() 在对象没有更多引用时由垃圾收集器调用。您可以覆盖它,最佳实践是在 try-catch-finally 块中使用它来释放文件等非 Java 资源。无论如何,如果您以这种方式使用它,您还应该调用 super.finalize() 以确保类层次结构最终确定。
此方法始终用于高级用途,不应在正常生产代码中使用。在使用这些资源的方法中的 finally 子句中释放您的资源。
【讨论】:
finalize打交道