我正在阅读有关 finalize() 方法并且很好奇:
在 finalize 中清理对象(将它们设置为 NULL )的任务和从内存中删除对象有什么区别?
finalize 中清理对象(将它们设置为 NULL )的任务有什么区别
设置为null会删除对对象的ONE引用。如果不再存在对某个对象的引用,则允许(不需要)垃圾收集器删除该对象
并从内存中删除一个对象?
java中没有明确的方法来删除(销毁,删除)一个对象。垃圾收集器会在他喜欢的时候做。尤其是从删除最后一个引用到删除/销毁对象的时间是不确定的
不需要在finalize方法中设置对null的引用。当垃圾收集器调用最终确定对象时,它的引用无论如何都会很快消失。
在我很长的 Java 经验中,我从未编写过自己的 finalize 方法。
如果您的对象正在处理 os-resources,那么编写自己的 finalize 方法是有意义的罕见情况。但是,通常您使用标准包进行操作系统访问
将对象设置为时不会“清理”对象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 子句中释放您的资源。