作为一名C++/Java/Android开发者,我有这样的经验,终结器几乎总是一个坏主意,唯一的例外是管理“本地对等”对象,这些对象需要通过JNI调用C/C++代码。 我知道JNI:正确管理java对象生命周期问题,但是这个问题解决的是不使用终结器的原因,即使是对于本地对等体。所以这是一个关...
出于好奇, 为什么finalize()方法的访问修饰符是protected。为什么不能是public?有人能解释一下背后的具体原因吗? 另外,我了解到finalize()方法只会被调用一次。如果我在我的程序中内部调用它两次,会发生什么?垃圾回收器会再次调用它吗?private void d...
在这个答案中,我发现: 如果在你的代码中使用了Dispose/Finalize模式,那么在Finalize方法中清理非托管资源,在Dispose方法中清理托管资源。 后来我找到了这篇很好的文章,对finalize和dispose有了一个清晰的想法。该文章有以下代码(第3页),用于解...
为什么Java 9中finalize()方法已被弃用? 是的,它可能会被错误地使用(例如仅一次保存对象免受垃圾收集或尝试在其中关闭一些本地资源,虽然这比不关闭好)。同样,许多其他方法也可能被错误地使用。 那么,finalize()是否真的如此危险或绝对无用,以至于必须将其从Java中删除?...
在面试中我被问到以下问题: 在对象被垃圾回收之前,调用对象的finalize()方法是发生的最后一件事情。 我选择了 True 但是答案是错误的。您可以解释一下为什么吗? 回答:False。 finalize() 方法不保证会被调用。例如,在JVM退出时,它们通常不会被调用。此外,...
我们最近将消息处理应用程序从Java 7升级到Java 8。自从升级以来,我们偶尔会遇到一个异常,即在读取流时该流已经关闭。日志显示,终结器线程正在调用包含流的对象的finalize()方法(这反过来又关闭了该流)。 代码的基本概述如下:MIMEWriter writer = new MIM...
我正在编写一个Java库。其中一些类是为库用户使用的,它们持有本地系统资源(通过JNI)。我希望确保用户“处理”这些对象,因为它们很重,在测试套件中可能会导致测试用例之间发生泄漏(例如,我需要确保TearDown将被处理)。为此,我使Java类实现了AutoCloseable,但这似乎不够,或...
在Java中,重写finalize方法有些名声不好,尽管我不明白为什么。像FileInputStream这样的类在Java 8和Java 10中都使用它来确保调用close方法。然而,Java 9引入了java.lang.ref.Cleaner,它使用幻象引用机制而非GC终结。起初,我认为这只...
如果我从程序代码中调用一个对象的finalize()方法,当垃圾收集器处理该对象时,JVM是否仍会再次运行这个方法? 以下是一个近似的例子:MyObject m = new MyObject(); m.finalize(); m = null; System.gc() 明确调用fina...
如果在Java的finalize方法中出现无限循环或死锁情况,Finalizer线程会怎么处理?