ThreadPoolExecutor的终结器未得到终结,造成了内存泄漏。
ThreadPoolExecutor的终结器未得到终结,造成了内存泄漏。
我在我的应用程序中运行客户端代码,就像Web服务器部署/取消部署Web应用程序一样。
因此,我创建了一个自定义的ClassLoader来丢弃客户端代码。然而,这并不能正常运行。当使用Elipse Memory Analyzer执行和分析时,我可以看到对象和类加载器从未被垃圾回收:
某种程度上,这个问题似乎与ThreadPoolExecutor
有关,它实现了finalize()
方法。在其他地方提到过finalize
方法是有问题的,可能会引起OutOfMemoryErrors
,因为Finalizer线程以较低的优先级运行。但是,在使用VisualVM分析应用程序和线程堆栈时,Finalizer线程并不繁忙,而是在等待新工作的到来:
"Finalizer" daemon prio=5 tid=0x00007fdb1484f800 nid=0x2603 in Object.wait() [0x000000010aaf6000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x000000079aaadf10> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135) - locked <0x000000079aaadf10> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:177) Locked ownable synchronizers: - None
ReferenceQueue.remove(ReferenceQueue.java:135)
的JavaDoc:
Removes the next reference object in this queue, blocking until either one becomes available or the given timeout period expires.
任何想法导致这个问题,应该怎么办?非常感谢你的输入!
编辑:我们正在使用jdk1.7.0_09.jdk,所以我想这与这个bug无关。
编辑:当我让应用程序运行足够长的时间(并执行和丢弃了足够多的客户端代码)后,我确实遇到了OutOfMemoryErrors,因此VM应该垃圾回收类。此外,使用-verbose:gc
标志,在类应该就绪进行最后处理且在进行HeapDump之前,我看到以下日志输出:
[Full GC 57007K->52790K(149544K), 0.2997010 secs]
这意味着一次完整的GC已经发生了。
admin 更改状态以发布 2023年5月22日