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 中显示了最终确定的工作原理
终结器线程负责清除终结队列中的对象。具有讽刺意味的是,同一个终结器线程会导致 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 中显示了最终确定的工作原理