gpt4 book ai didi

java - 哪些情况下实际使用了finalize()?

转载 作者:行者123 更新时间:2023-12-02 05:27:27 25 4
gpt4 key购买 nike

我发现多篇文章指出何时不应使用 Finalize() 以及一般情况下不应使用它,因为没有人保证该对象将在应用程序的生命周期内被垃圾收集(除非您确实需要对象在应用程序的整个生命周期中,这是我书中的内存泄漏)。但假设我有一个 Java 类,它通过 JNI 在 native 空间中初始化某些内容(执行内存分配和初始化)。就我而言,有两种方法可以实现这一点:
1. 在类中实现 init() 和 deinit() 方法来进行 native 初始化和反初始化。这有一个缺点,就是我必须处理对象生命周期,不能将其留给垃圾收集器(这与 Java 不太相似)。
2. 在构造函数中进行初始化,在finalize()方法中进行反初始化。这基本上使得对象能够像任何其他 Java 类一样被自动垃圾收集。

我要问的是 - 我有理由不选择第二个吗?

谢谢,
内纳德

最佳答案

What I'm asking is - is there a reason for me not to go with number 2?

原因之一是,在 GC 回收 Java 对象之前, native 资源不会被释放,而 Java 对象的 finalize 方法将回收它。

这个原因是否确实相关取决于 native 资源的性质。

<小时/>

真的,当你仔细想想,这与 Java 设计者关于关闭流的争论是一样的。

  • 他们可能没有提供 close() 方法,而将其完全留给 finalize 方法...除非这会导致以下问题:输出流没有足够快地刷新,并且耗尽了“文件描述符”。

  • 他们本可以将其完全留给 close() 方法...除非您确实忘记 close() 一个文件(并且那里不是 finalize 方法)你会永久泄漏文件描述符......

  • 相反,他们实现了 close()finalize,并且实现了后者来调用前者。因此,您可以在程序提示时关闭,并在程序忽略调用 close() 时进行清理1

1 - 当然,如果您依赖流finalize方法进行清理,可能会出现问题;例如如果流意外地仍可访问,或者没有足够快地进行垃圾收集,并且无论如何都会用完文件描述符。不确定性的刷新输出也可能是一个问题。

<小时/>

OK. What about when the resource in question is purely memory? Isn't that the same as garbage collecting then?

我没看到这一点。真正的垃圾收集并不依赖于您实现 Finalize 方法、close 方法或其他显式释放内容的方法。

关于java - 哪些情况下实际使用了finalize()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25870733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com