什么是在Java中清理对象的最佳方法?
什么是在Java中清理对象的最佳方法?
在 Java 中,我们没有像 C++ 中那样的析构函数。
问题1:在 Java 中应该如何清理对象。
问题2:有没有finally块的替代方案。
问题3:有时我们需要从我们的类中显式调用第三方代码的初始化/终止,例如:
public classs MyClass{ public MyClass(){ ThirdPartyInitialize(); } protected void finalize(){ ThirdPartyTerminate(); } }
这样做是正确的吗?
admin 更改状态以发布 2023年5月22日
如果您的程序也要关闭,您还可以向您的程序添加关闭钩子(shutdown hook):
//add shutdown hook Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { ThirdPartyTerminate(); } });
通常情况下,你不能自己“清理”Java对象。垃圾收集器决定何时清理对象。你可以通过将对象引用设置为null
来表明你已经完成了对该对象引用的使用,但通常只要让它超出作用域就足够了。无论哪种方式,你仍然无法控制何时进行垃圾回收。\n\nfinally
块用于在try
块抛出异常与否时执行操作,是执行清理工作的最佳位置。通常只会对非对象资源(如打开的流)进行清理。\n\nfinalize()
不能保证被调用,因为垃圾回收器不能保证在程序退出之前被调用。它并不像C++中的析构函数一样,因为C++构造函数总是被调用并且你可以依赖它们被调用。你无法依赖finalize()
被调用。\n\n因此,1)使用finally
块释放非对象资源 2)让垃圾回收器清理对象资源 3)如果在长时间运行的方法中使用对象,并且表示已经完成对它的使用,则可以将其设置为null
以提示垃圾回收器。