41得票6回答
Java的finalizer在本地对等体对象生命周期管理中也应该避免使用吗?

作为一名C++/Java/Android开发者,我有这样的经验,终结器几乎总是一个坏主意,唯一的例外是管理“本地对等”对象,这些对象需要通过JNI调用C/C++代码。 我知道JNI:正确管理java对象生命周期问题,但是这个问题解决的是不使用终结器的原因,即使是对于本地对等体。所以这是一个关...

37得票9回答
为什么Java中java.lang.Object类的finalize()方法是“protected”访问修饰符?

出于好奇, 为什么finalize()方法的访问修饰符是protected。为什么不能是public?有人能解释一下背后的具体原因吗? 另外,我了解到finalize()方法只会被调用一次。如果我在我的程序中内部调用它两次,会发生什么?垃圾回收器会再次调用它吗?private void d...

32得票2回答
Dispose()用于清理托管资源吗?

在这个答案中,我发现: 如果在你的代码中使用了Dispose/Finalize模式,那么在Finalize方法中清理非托管资源,在Dispose方法中清理托管资源。 后来我找到了这篇很好的文章,对finalize和dispose有了一个清晰的想法。该文章有以下代码(第3页),用于解...

31得票1回答
为什么Java 9中废弃了finalize()方法?

为什么Java 9中finalize()方法已被弃用? 是的,它可能会被错误地使用(例如仅一次保存对象免受垃圾收集或尝试在其中关闭一些本地资源,虽然这比不关闭好)。同样,许多其他方法也可能被错误地使用。 那么,finalize()是否真的如此危险或绝对无用,以至于必须将其从Java中删除?...

30得票6回答
Java面试问题:finalize()方法

在面试中我被问到以下问题: 在对象被垃圾回收之前,调用对象的finalize()方法是发生的最后一件事情。 我选择了 True 但是答案是错误的。您可以解释一下为什么吗? 回答:False。 finalize() 方法不保证会被调用。例如,在JVM退出时,它们通常不会被调用。此外,...

30得票3回答
Java 8 中对强可达对象调用 finalize() 方法

我们最近将消息处理应用程序从Java 7升级到Java 8。自从升级以来,我们偶尔会遇到一个异常,即在读取流时该流已经关闭。日志显示,终结器线程正在调用包含流的对象的finalize()方法(这反过来又关闭了该流)。 代码的基本概述如下:MIMEWriter writer = new MIM...

29得票5回答
在Java中,如何检查已经调用了AutoCloseable.close()方法?

我正在编写一个Java库。其中一些类是为库用户使用的,它们持有本地系统资源(通过JNI)。我希望确保用户“处理”这些对象,因为它们很重,在测试套件中可能会导致测试用例之间发生泄漏(例如,我需要确保TearDown将被处理)。为此,我使Java类实现了AutoCloseable,但这似乎不够,或...

24得票4回答
Java 9清理器是否应该优先于终结器?

在Java中,重写finalize方法有些名声不好,尽管我不明白为什么。像FileInputStream这样的类在Java 8和Java 10中都使用它来确保调用close方法。然而,Java 9引入了java.lang.ref.Cleaner,它使用幻象引用机制而非GC终结。起初,我认为这只...

18得票3回答
Java和手动执行finalize

如果我从程序代码中调用一个对象的finalize()方法,当垃圾收集器处理该对象时,JVM是否仍会再次运行这个方法? 以下是一个近似的例子:MyObject m = new MyObject(); m.finalize(); m = null; System.gc() 明确调用fina...

16得票3回答
如果Java的finalize方法存在无限循环或死锁,Finalizer线程将会怎样处理?

如果在Java的finalize方法中出现无限循环或死锁情况,Finalizer线程会怎么处理?