覆盖Object类的finalize()方法有什么用?

Rah*_*hul 6 java garbage-collection

据我所知,在java中,如果我们想手动调用垃圾收集器,我们可以做System.gc().
1.我们在覆盖的finalize()方法中执行的操作是什么?
2.如果我们想手动调用JVM垃圾收集器,是否需要覆盖finalize()方法?

Tad*_*pec 9

我们在覆盖的finalize()方法中执行的操作是什么?

手动释放空闲内存(通过一些本机调用),即不由GC管理.这是一个非常罕见的情况.有些人还在那里检查,与对象相关的其他资源已经被释放 - 但它仅用于调试目的而且不太可靠.
你必须记住:

  1. finalize 关于记忆和记忆.
  2. 您无法控制何时调用它,甚至是否可以调用它.

所以永远不要放在那里释放任何其他资源(如文件句柄,锁).必须手动释放所有这些资源.
覆盖终结与呼叫无关System.gc().


Puc*_*uce 6

其他人已经解释了最终方法.

但请注意,最佳实践是设计"关闭"/"清理"/"终止"方法来关闭/清理对象,并要求开发人员明确调用此方法.终结器应仅用作安全网.(参见Joshua Bloch撰写的"有效Java"的"第7项:避免终结者")

更新:

在这种情况下,还要考虑实现AutoCloseable以支持try-with-resources块.


Rob*_*een -1

1.我们在重写的finalize()方法中做了哪些操作?

清理垃圾收集无法处理的资源。

2.如果我们想手动调用JVM垃圾收集器,是否需要重写finalize()方法?

不,这两件事是无关的。

Finalize 当然不应该调用垃圾收集器本身。事实上,finalize 是垃圾收集器调用的(但根本不保证被调用)。