2011-06-08 71 views
0

我在Oracle iPlanet Web服務器7中部署了一個Web應用程序。網站在Internet中被主動使用。java中導致內存泄漏的原因

部署之後,堆大小不斷增加,並在2或3周後引發OutOfMemory錯誤。

所以我開始使用分析工具。我不熟悉堆轉儲。所有我注意到char [],hashmap和String對象在堆中佔據太多。我怎麼能注意到什麼導致堆轉儲內存泄漏?我對我的內存泄漏的抨擊;

  • 我在log4j中使用log4j進行了大量日誌記錄以保存log.txt文件。它有問題嗎?

  • 刪除非活動會話可能是錯誤嗎?

  • 一些靜態值,如城市,性別類型存儲在靜態哈希表?

  • 我有一個登錄機制,但沒有註銷機制。當網站再次打開時,需要新的登錄。 (愚蠢但尚未實現。)?

  • 全部?

你對他們有什麼想法嗎?或者你可以添加另一個關於內存泄漏的假設嗎?

+1

是否有東西擺脫陳舊的會議?或者,會話是存儲在磁盤上的,而當應用程序沒有處理請求時,不會在內存中保留或引用會話? – cHao 2011-06-08 19:52:10

+0

嗨cHao,我有一個偵聽器,可以刪除不活動的會話。它不應該是一個問題。至少是最不重要的一個。 – asyard 2011-06-08 19:57:58

回答

1

由於Java有垃圾回收,「內存泄漏」通常會導致您在不應保持活動狀態時保留對某些對象的引用。 你或許能從物體的年齡看到哪些物體可能是舊的,並且當它們不應該存在的時候會被保留下來。

  • log4j不應該引起任何問題。
  • 散列圖應該沒問題,因爲你實際上想要保留這些值。
  • 非活動會話可能是問題,如果它們存儲在內存中,並且某些東西保留對它們的引用。
+0

嗨真理,謝謝你的回答。我將在明天工作中描述這些物體的年齡。 cHao和你認爲它可能會議問題,所以我會尋找詳細的會議去除實施也。 – asyard 2011-06-08 20:03:20

1

還有一件事你可以嘗試:新項目,​​,它旨在找到Java應用程序中的內存泄漏。它處於測試階段,但應足夠穩定以便嘗試。

作爲一個邊節點,Strings和char []幾乎總是在探查器的數據之上。這很少意味着任何真正的問題。