【问题标题】:Finalize() cleanup vs. Garbage Collector removing an object from memoryFinalize() 清理与垃圾收集器从内存中删除对象
【发布时间】:2023-03-12 13:24:02
【问题描述】:

我正在阅读有关 finalize() 方法并且很好奇:

finalize 中清理对象(将其设置为 NULL)和从内存中删除对象的任务有什么区别?

【问题讨论】:

  • 这是什么语言?请正确标记问题。
  • 重新标记为 Java,因为 finalize 是 Java GC 方法

标签: java garbage


【解决方案1】:

清理对象的任务有什么区别( 在 finalize 中将它们设置为 NULL )

设置为 null 会删除对对象的 ONE 引用。 如果 NO 存在对某个对象的更多引用,则允许(非必需)垃圾收集器删除该对象

并从内存中删除一个对象?

在 java 中没有明确的方式来移除(销毁、删除)一个对象。 垃圾收集器会在他喜欢的时候做。 尤其是从删除最后一个引用到删除/销毁对象的时间是不确定的

NO需要在finalize方法中设置对null的引用。 当垃圾收集器调用 finalize 时,对象及其引用很快就会消失。

在我很长的 Java 经验中,我从未编写过自己的 finalize 方法。

如果您的对象正在处理 os-resources,那么编写自己的 finalize 方法是有意义的罕见情况。但是,通常您使用标准包进行操作系统访问

【讨论】:

  • 此外,在 finalize 方法中执行 anything 会极大地减慢 GC。 Effective Java 引用了一个基准,表明垃圾收集速度降低了 430 倍——是的,这超过了两个数量级。
【解决方案2】:

当您将对象设置为null 时,您不会“清理”对象,您只是将引用设置为 null,请考虑:

Object a = new Object();
Object b = a;
a = null;
System.out.println(b);

一旦对象丢失所有引用,它将在下一次 GC 传递时被收集。 Finalize 是一个在发生这种情况时被调用的方法,您应该避免使用它

只是不要保留额外的引用,让 GC 完成它的工作。

【讨论】:

  • 如何释放所有参考。在半低级别的解释中,GC 的收集是什么样的?我知道我不能通过不调用 b 来获得更多参考,但是 gc 如何摆脱所有参考
  • 通过将变量 a 设置为 null,它就有资格被垃圾收集器释放
【解决方案3】:

finalize() 在对象没有更多引用时由垃圾收集器调用。您可以覆盖它,最佳实践是在 try-catch-finally 块中使用它来释放文件等非 Java 资源。无论如何,如果您以这种方式使用它,您还应该调用 super.finalize() 以确保类层次结构最终确定。

此方法始终用于高级用途,不应在正常生产代码中使用。在使用这些资源的方法中的 finally 子句中释放您的资源。

【讨论】:

  • 最佳实践是永远不要与finalize打交道
  • 另外,这并不能回答问题
  • 如果我只是学习java,我应该不担心如何在内存中删除对象的细节吗?我找到了这个教程javarevisited.blogspot.com/2011/04/…。编写 Android 应用程序是否需要了解垃圾收集器的内部工作原理?
  • 我觉得这很难理解——你是说最好的做法是让我们作为开发人员调用 finalize() 方法吗?或者您是说如果对象在 GC:ed 之前保留文件,则应该使用 finalize 的实现(这是最好的做法)?
  • 不,你不应该直接使用 finalize(),因为它是由垃圾回收调用的,你应该在普通代码或 finally 子句中释放资源。然而,Java 公开了此功能以供高级使用。不得不说,我用Java开发的同事总是说“GC总是比你聪明”!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 2012-01-03
  • 2017-08-22
  • 2013-04-25
相关资源
最近更新 更多