2009-08-31 48 views
0

首先,我說謊,它不是一個真正的普通jsp網站。它有幾頁數據庫訪問和一個基於lucene的搜索引擎......以及大約400個獨立的jsp頁面。在普通的jsp站點上可能的內存泄漏

的問題是,我們不能訪問到生產服務器上的管理員,說該網站是消耗太多的內存(200 +兆),以及我們可能面臨一個內存泄漏,因爲他們迫使重新啓動它。

我不是一個jsp專家,但我懷疑這不是真正的內存泄漏,並且數據庫頁面和lucene搜索與此問題無關。我知道每個jsp頁面都被編譯成一個java類,然後執行,並保存在內存中供以後訪問。

真正的問題是:可以提升(對於400,我認爲是)獨立jsp頁面數量導致內存使用量增長到200M?

如果是的話,你會如何降低內存使用量?使用包含SSI(避免爲此目的使用jsp頁面)可能是一種選擇?

在此先感謝

回答

1

每個JSP只有一兆字節並不是我通常所期望的。顯然,可以在JSP中編寫任何代碼,這樣編譯後的jsp可以很大,並且可以分配大量的內存,但假設這些是傳統的JSP,那麼我最懷疑運行時行爲而不是剪切JSP的數量。

一種可能性是你有很多會話數據。隨着用戶逐頁移動,會話大小可能會增加。將從數據庫中檢索到的數據暫時放在會話中以便可以在另一個頁面中使用它是很常見的。如果不能整理,你可以迅速消耗大量的內存。

+0

好吧,所以每個jsp的半個meg並不是平常的東西。有一些JSP消耗大約1.5M,並且僅由文本(大約15k)組成,並且包含語句,並且沒有會話垃圾。這很奇怪,因爲沒有jsp頁面的權重小於600k。 – azkotoki 2009-09-07 09:53:13

+0

我可以建議的只有一個這樣的JSP,並逐漸刪除部分,直到找到正在發生的事情。也許一些大型數據結構正在創建?考慮到JDBC結果集可能沒有被快速關閉? – djna 2009-09-07 10:49:16

1

知道什麼消耗內存的唯一方法就是使用一個分析器。我們做的是採取堆轉儲,然後對其進行分析,以下列方式:

  • 使用jmap實用程序(自帶JDK),以獲得堆轉儲。它應該以root身份運行!
  • 將文件下載到現場機器
  • 下載並安裝Eclipse Memory Analyser - 還有其他的(如jhat),但我個人喜歡它。
  • 用它打開文件
  • 查看哪些類佔用了大部分內存。

無論如何,在服務器引導之前預編譯JSP總是很好的。

0

您需要確定內存花費的位置。 200MB太多的說法實際上是無用的,因爲它取決於用法,應用程序如何使用內存(例如,如David提到的會話數據)。您需要分析應用程序生命週期中不同時間的堆轉儲和詳細gc日誌,以瞭解其使用情況,以及您是否確實存在內存泄漏(如果應用程序在200 MB時穩定不成功,如果每x小時增加一次沒有暗示的跡象,你可能會這樣做)。