Jetty 8服务器上的内存泄漏问题

4
我已经获取了内存转储文件,并使用内存分析器进行了分析。结果显示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

请告知我。
1个回答

2
这不是一个泄漏本身。请阅读此文:http://www.oracle.com/technetwork/articles/javase/finalization-137655.html,了解JVM中的finalisation机制。
如果创建了太多的finalazble对象(在你的情况下是FileInputStream),则Finalizers可能会成为问题。您可以尝试适当减少堆大小,以便垃圾收集器更频繁地运行并更快地处理它们。
或者,如果可能的话,最好减少对FileInputStream的使用。

我们在Jetty Server 8上运行高负载的Web应用程序,因此为该进程保留了2GB的内存。使用jmap发现老年代内存正在快速填充,我们总是在老年代达到90%时重新启动服务器。当内存满时,它会被清除吗?只是担心服务器崩溃。 - hridayesh
说实话,在老年代达到90%时重新启动服务器是很奇怪的。你不相信垃圾回收器吗?还是你的数据量超出了内存容量?或者你怀疑存在内存泄漏?那么,试试我们的http://plumbr.eu工具。 - Nikem
我之前不知道Java中的Finalizer,怀疑出现了内存泄漏,所以重启了。感谢您的澄清。 但是,GC不是只有在所有内存都满了的时候才运行吗?GC只会在100%的内存被旧代Finalizer对象填满时才运行吗? - hridayesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接