2011-06-13 151 views
0

我們使用了eclipse內存分析器,它在堆中顯示以下內容。堆快照已附加。這會導致未來的內存泄漏嗎?Java EE應用程序堆問題

我無法確定哪個文件正好導致如此多的對象被保留在堆上。你能提供一些關於這方面的見解嗎?我們在Spring框架和tomcat 5.5服務器上使用Java EE應用程序。使用的數據庫是mysql。

在此先感謝。

The heap snapshot

enter image description here

+0

問題是什麼?什麼讓你擔心? – bmargulies 2011-06-13 12:33:58

+0

有很多對象保留在堆上。這是否會導致內存不足異常?它似乎發生過一次。我想要找到根本原因... – 2011-06-13 12:42:26

回答

2

堆棧看起來並不特別令人擔憂,如果你問我。

顯示的條目由Spring框架創建並用於提高其性能。由於Spring和許多其他現代Java框架一樣,使用反射來耦合bean,注入東西,應用配置等,所以如果所有的spring bean都被一遍又一遍地檢查,它會有點慢。 Spring爲此緩存了這個檢查的結果。

另請注意,正在使用WeakHashMap,它具有與垃圾收集有關的特殊屬性(請閱讀其Javadoc以瞭解更多信息)。

+0

問題是eclipse內存分析器顯示3個可能的泄漏嫌疑人已保留大約3.5 mb的堆每個。這可能表明可能的內存泄漏? – 2011-06-13 12:47:39

+1

MAT是否已經指出特定部分可能泄漏?我仍然不會擔心一些10MB的內存使用量,但是模擬一些負載(例如通過JMeter),讓它運行一段時間並再次檢查這個特定的部分。由於您的應用程序中的bean數量有限,因此我希望內省的結果也是有限的。 – 2011-06-13 12:52:10

+0

我已經添加了內存分析器的另一個快照,顯示泄露嫌疑人?如此多的堆空間被佔用是否正常? – 2011-06-13 13:07:06

1

查找是否真的有內存泄漏的最好方法是在各個級別上昏迷它: 1.在應用程序啓動並且沒有提供任何請求後,獲取堆內存快照。 2.在提供請求時使用各種級別的快照(正在使用應用程序快照) 3.處理完所有請求後,在3-4分鐘後拍攝快照。

如果沒有內存泄漏1和3快照應該大致相同。

如果他們不是,你可以看到哪些額外的對象佔用內存。從您的定製軟件包開始跟蹤,而不是Spring或JDBC或核心庫軟件包。

+0

這是我可以嘗試做的事情。謝謝 – 2011-06-14 06:01:14