2011-05-11 37 views
2

我們運行一個大型的基於Java的應用程序,它正處於重大的發展階段。每隔3到6個月,似乎我們不得不增加PERM內存的大小,否則無論是應用程序啓動還是聯機後不久,都有可能導致內存不足。該應用程序託管在JBoss 4.2和Tomcat服務器中。Java中有多少是PERM(1.5GB似乎很高)

我們目前的設置是:

-server -Xms12G -Xmx12G -XX:MaxPermSize參數= 1536M -XX:+ UseConcMarkSweepGC -XX:+ CMSIncrementalMode

我可以幫助,但不知道這似乎可怕高。

PERM內存在啓動時似乎很快就會填滿。使用jstat的任何地方在90到99%之間。

我們的web應用程序包含30個單獨的戰爭文件。在JBoss中,這些部署爲一個大的300MB + ear文件。

大型應用程序對我們這麼多PERM來說是正常的嗎?

+0

也許是時候打破應用程序?這個300MB的EAR文件是什麼?您必須擁有大量圖形和其他內容,也許可以將您的靜態內容移動到由Web服務器提供服務並讓AppServer執行邏輯。 – 2011-05-11 02:49:11

+1

這看起來真的非常非常非常高。沒有什麼真正有用的建議,但你的代碼庫有多大?是否有可能在不同的類加載器中加載多個庫副本?對於當前的JBoss Classloader不太瞭解,除了已經報告過問題之外,您是否在另一個容器上得到類似的結果? – 2011-05-11 02:53:20

+0

代碼庫相當龐大(ERP系統)。 100多個外部jar庫(有些是客戶現成的),它們在EAR文件(common lib)中是「共享的」,但從我的閱讀中看來,每場戰爭都會得到自己的副本。真的嗎? – jrhickey 2011-05-11 18:06:40

回答

6

這是hella很多的permgen空間。如果馬上填滿,那意味着幾乎不可思議的課程數量。這30個戰爭檔案中的圖書館有很多重複嗎?通過從通用的類加載器接近根,而不是在每個分離的webapp中加載通用庫,可以節省大量空間。嘗試在服務器目錄中安裝通用庫。

+1

interned字符串需要permgen空間,我會使用分析器來確定使用這麼多內存的內容。如果有重複。 – 2011-05-11 05:31:45

+0

據我所知,所有常見的jar文件都在EAR的lib目錄或tomcat上的公共lib目錄中。根據我上面的評論和一些閱讀,似乎每場戰爭都會加載它自己的lib文件副本,但仍然試圖證實這一點。 – jrhickey 2011-05-11 18:09:48

0

是1.5 GB的開銷來管理一個12 GB的堆以及類代碼/靜態數據真的很離譜?

0

您是否認爲應用程序中可能存在內存泄漏?嘗試使用JProfiler或Eclipse MAT等分析工具來分析應用程序的內存使用情況。我已經看到,簡單的內存泄漏可能會在一段時間內造成巨大的中斷。

+0

是的。在我回到球隊之前,我想獲得一些額外的意見。似乎互聯網已經證實了我的假設。 – jrhickey 2011-05-11 18:08:17