Finalizer 线程会导致内存不足吗?

Do Finalizer thread can cause Out of Memory?

终结器线程负责清除终结队列中的对象。具有讽刺意味的是,同一个终结器线程会导致 OOM 吗?

简短回答:理论上是的。

更具体地说,它取决于你的终结器线程是如何构造的以及他做了什么。通常,如果没有剩余可用内存,任何新对象创建都可能导致 OOM。

简短的回答是肯定的。

一些 classes 实现了 Object.finalize() 方法。覆盖此方法的对象需要通过后台线程调用来调用 终结器,并且在这种情况发生之前无法清理它们。如果这些任务很短并且您没有放弃其中的许多任务 一切正常。但是,如果您要创建大量此类对象 and/or,它们的终结器会花费很长时间, 待完成的对象队列建立起来。这个队列有可能用完所有内存。

如果创建了很多带有终结器的对象,很可能会出现性能问题, 即使使用 try-finalize 块显式释放底层本机资源。

尝试超越 java 带终结器的垃圾收集器的代码显示了以下结果。

如果创建了很多带有终结器的对象,那么超越 Java 垃圾收集器是非常容易的, 导致大量对象出现虚假的内存不足错误,理论上可以在 reclaimed.More 上找到 linkhttp://www.enyo.de/fw/notes/java-gc-finalizers.html

过去有一些应用程序遇到过此终结器队列建立问题,因此值得考虑 如何处理。一种明显的方法是增加 "Finalizer" 守护线程的优先级——没有 API 的优先级, 所以你必须 运行 通过所有线程来按名称找到它,然后提高它的优先级。

您还可以通过删除 finalize() 方法并使用您自己的显式队列来显式控制终结 使用您自己的 Reference 对象,其方式与 Finalizer class 处理对象及其 finalize() 的方式非常相似 方法 。这样您就可以控制完成处理线程的优先级和调度。

请注意,这些技术都没有减少拥有可终结对象的开销, 他们只是避免了由于优先级较低的线程而导致的队列堆积。

为好奇

,下面的 link 中显示了最终确定的工作原理

http://www.fasterj.com/articles/finalizer2.shtml