我已经进行了内存转储,用内存分析器对其进行了分析。它显示了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
请告诉我。
答案 0 :(得分:2)
这本身并不是泄漏。请阅读:http://www.oracle.com/technetwork/articles/javase/finalization-137655.html关于JVM中的终结机制。
如果创建了太多的可调用对象,则终结器可能会成为问题,在您的情况下是FileInputStream。您可以尝试稍微减小堆大小,以便垃圾收集器更频繁地运行并更快地处理它们。
或者,如果可能的话,更好地减少对FileInputStreams的使用。