ThreadPoolExecutor的终结器未得到终结,造成了内存泄漏。

25 浏览
0 Comments

ThreadPoolExecutor的终结器未得到终结,造成了内存泄漏。

我在我的应用程序中运行客户端代码,就像Web服务器部署/取消部署Web应用程序一样。

因此,我创建了一个自定义的ClassLoader来丢弃客户端代码。然而,这并不能正常运行。当使用Elipse Memory Analyzer执行和分析时,我可以看到对象和类加载器从未被垃圾回收:\"Path

某种程度上,这个问题似乎与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日
0
0 Comments

尝试了其他一切后,我升级了JDK...现在问题已经解决了。现在我们使用的是jdk1.7.0_51,而不是jdk1.7.0_09

希望这能帮到别人...

0