簡體   English   中英

java Web應用程序中的內存泄漏

[英]Memory leak in java web application

我有一個使用hibernate 3.6.4和spring 3.2.4(mvc,tx和security)並在tomcat 7中運行的Web應用程序。每當我部署更新版本的應用程序而不重新啟動tomcat時,則使用的內存由tomcat增加約50MB。

我創建了一些堆轉儲並使用Eclipse Memory Analyzer進行分析。 我發現每次重新部署應用程序時,都會創建一個新的WebappClassLoader實例。 但即使在我使用tomcat管理器停止應用程序之后,WebappClassLoader仍然保留在內存中,並且不會被垃圾回收。 因此,在每次重新部署之后,額外的WebappClassLoader將保留在內存中並使用大約50MB的內存。

我使用Eclipse Memory Analyzer來查找從WebappClassLoader到GC根的引用路徑。 在結果中,我找不到任何可能阻止WebappClassLoaders被垃圾回收的強引用。

在此輸入圖像描述

那么,是什么讓WebappClassLoaders保持活力? 我可以在哪里調查,以找出什么阻止垃圾收集的WebappClassLoader?

我認為可能有一個阻塞的finalize()方法阻止GC完成垃圾收集。 但我怎么能檢查這個?

理論上,類加載器在沒有引用對象實例的情況下是垃圾收集的,並且類卸載不是必需的,但實際上它似乎更有問題。

我建議閱讀這兩篇文章

http://frankkieviet.blogspot.com.au/2006/10/classloader-leaks-dreaded-permgen-space.html

http://frankkieviet.blogspot.com.au/2006/10/how-to-fix-dreaded-permgen-space.html

您也可以按照PermGen Memory Leak剖析中提供的步驟進行操作。 他們使用的是Java Visual VM,但是Eclipse Memory Analizer中的步驟和要檢查的內容也應該相同。 演示文稿中,您可以找到此類泄漏的可能原因。

另請注意,如果您沒有看到對WebappClassLoaders任何引用,那么JVM可能會有大量的PermGen並且正在推遲驅逐。 你可以通過運行較小的PermGen大小來輕松檢查這一點並進行一些重新部署。

我不是Tomcat的專家,它是重新部署的實現,但在我們使用JBoss的日子里,我們的情況非常相似。 這是因為PermGen空間不是垃圾收集的,每個新部署都會在那里放置類。 因此,如果您不在Java 8上,請檢查實際的“泄漏”是否不在permgen空間中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM