我已经获取了内存转储,并用内存分析器进行了分析。它显示java.lang.ref.finalizer对象占用了73%的内存。我去看看这个很大的物体里面是什么。我发现它看起来像是对象的递归轨迹。看起来低于
Finalizer
|__ Finalizer (recursive)
|__ java.io.FileInputStream or org.eclipse.jetty.util.resource.FileResource
在FileResource中,我找到了提取war文件的路径,但找不到FileInputStream对象中的内容。
屏幕截图也可以在这里找到。https://lh4.googleusercontent.com/-uZTZ031DlqI/UD33kMskuZI/AAAAAAAABYo/eOrqw65k_Mw/s1179/summary.png
https://lh6.googleusercontent.com/-yWBPUV_71js/UD33kAYYDEI/AAAAAAAABYk/J9fF_WwOeO4/s1074/details.png
请告诉我。
这本身不是泄漏。请阅读以下内容:http://www.oracle.com/technetwork/articles/javase/finalization-137655.html关于JVM中的最终确定机制。
如果创建了太多可最终确定的对象(在您的例子中是FileInputStream),终结器可能会成为一个问题。您可以尝试在一定程度上减小堆大小,以便垃圾回收器能够更频繁地运行并更快地处理它们。
或者,如果可能的话,最好减少对FileInputStreams的使用。