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

时间:2015-04-30 10:01:12

标签: java out-of-memory finalizer

终结器线程负责清除终结队列中的对象。具有讽刺意味的是,相同的终结者线程可以负责OOM吗?

2 个答案:

答案 0 :(得分:1)

简短回答:理论上是。

更具体地说,它取决于你的终结者线程的构造方式以及他的工作方式。通常,如果没有空闲内存,任何新对象创建都可能导致OOM。

答案 1 :(得分:0)

简短的回答是肯定的。

某些类实现了Object.finalize()方法。覆盖此方法的对象需要通过后台线程调用来调用 终结者,他们无法清理,直到发生这种情况。如果这些任务很短,你就不要丢弃其中的许多任务 一切都运作良好。但是,如果您要创建大量这些对象和/或他们的终结者需要很长时间, 要完成的对象队列建立起来。该队列可能会占用所有内存。

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

使用终结器尝试超过java垃圾收集器的代码显示以下结果。

如果创建了许多带有终结器的对象,那么超出Java垃圾收集器是非常容易的, 导致虚假的内存不足错误,理论上可以回收大量的对象。更多关于这一点可以在 链接http://www.enyo.de/fw/notes/java-gc-finalizers.html

有些应用程序过去曾遇到此终结器队列构建问题,因此值得考虑 如何处理它。一个显而易见的方法是提高" Finalizer"的优先级。守护程序线程 - 没有这个API, 因此,您必须遍历所有线程以按名称查找它,然后增加它的优先级。

您还可以通过删除finalize()方法并使用自己的显式队列来明确控制最终化 使用您自己的Reference对象的方式与Finalizer类处理对象及其finalize()的方式非常相似 方法 。这样就可以控制最终处理线程的优先级和时间表。

请注意,这些技术都没有减少可终结对象的开销, 由于优先级较低的线程,它们只是避免了队列的建立。

最终确定如何运作在下面的链接中显示了好奇的

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