2013-05-25 17 views
0
我有在部署在WebSphere應用程序內存溢出問題

的7每個部署數量增加加載的類

我使用yourKit,試圖解決它發生的事情,一個有趣的事情,我可以看到的是,當我第一次啓動我的應用程序時,它會加載大約20k個類,並且每次我進行另一次部署時(不重新啓動websphere),此數字將增加2k,並且堆大小隨之增加。

我猜這是根本問題,但我不知道如何解釋爲什麼發生這種情況。

我試圖列出所有的類之前一個部署和一個又一個,但這沒有工作得很好,因爲我無法列出所有20k類(只有10k不知道爲什麼)。當我比較這兩個列表時,我發現了大約600個新的類,它們確實來自我的應用程序或來自我的應用程序的依賴關係。

我發現我的大部分應用程序類都是枚舉類和DAO類的實現。

我的應用程序是一個使用Struts和Spring框架的Java EE 6應用程序。

有什麼想法?

+0

類加載器泄漏的樂趣! http://frankkieviet.blogspot.com/2006/10/classloader-leaks-dreaded-permgen-space.html – DannyMo

+0

@damo websphere 7很有趣:) – WeMakeSoftware

+0

請注意,您的問題描述存在不一致,因爲您是談論Java EE 6應用程序,但WebSphere 7是一個Java EE 5應用程序服務器。 –

回答

1

OutOfMemoryError可能在JVM的堆空間或permGen空間已滿時導致。

如果您遇到的問題是由重新部署應用程序引起的,則可能是您正在訪問PermGen OOME。當應用程序服務器無法從其內存中完全卸載類的定義(內存泄漏)時,會發生這些情況。

這種情況很普遍(至少從我的經驗來看),通常開發人員只是增加應用程序服務器的PermGen大小或者僅僅反彈應用程序服務器來清理PermGen。

+0

PermGen是一個適用於Sun/Oracle JVM的概念。在IBM JVM上,情況略有不同。 Class對象只是堆中的對象,並不屬於不同的世代。代碼被加載到一個單獨的內存區域,其大小不受限制。 –

0

這是一個典型的類加載器泄漏。這可能是由您的應用程序或運行時中的錯誤(即WebSphere或JRE)造成的。請注意,WAS 7中有很多這種功能,特別是在較早的修訂包中。

你可能想諮詢以下文件得到一些更深入地瞭解這個問題:

https://code.google.com/p/arit/wiki/GettingStarted