Jboss

是什麼導致 JBoss 上的 PermGen OutOfMemoryError?

  • August 5, 2012

JBoss 中 PermGen OutOfMemoryError 的根本原因是什麼?

我在我的開發環境中執行 JBoss AS 4.2.2,這發生在重新部署我的 Web 應用程序很多次之後。

Christian Vest Hansen 的部落格給出的 JVM 選項很有幫助,但並沒有完全解決問題:

-XX:+UseConcMarkSweepGC
-XX:+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled
-XX:MaxPermSize=128m

如前所述,您可能會遇到洩漏的類載入器。由於某種原因,您的課程沒有被解除安裝。這可能有兩個原因

  • 所述類的對象仍然存在於堆中,對象總是引用它們的類,或者
  • 類載入器在某處被引用,無論出於何種原因,類載入器引用它們的類是為了不載入它們兩次

這個問題沒有萬能的解決方案。幫助您找到根本原因的一個有用工具是Eclipse 記憶體分析器工具,您可以將其應用於 JVM 的堆轉儲(您可以使用 -XX:+HeapDumpOnOutOfMemoryError 選項在 OOM 上啟用堆轉儲)。也許開始從您的 Web 應用程序中尋找 java.lang.Class 對象,以了解它們為何保持活動狀態。不幸的是,PermGen 通常不是 JVM 堆轉儲的一部分,因此您只能嘗試在堆的其餘部分中找到相關的工件(如果我沒記錯的話,類對像不會儲存在 PermGen 中,只有實際的字節碼是,請如果我錯了,請糾正我)。

HTH。

編輯:

Dave Cheney 在評論中建議 java.lang.Class-objects 確實是 PermGen 的一部分,並且不包含在正常的熱點堆轉儲中。除非您有一個在堆轉儲中寫入此資訊的 JVM,否則您將需要一種不同的方法。您仍然可以查找對象的實例,但如果您正在洩漏類/類載入器(不幸的是它們都相互暗示),您似乎需要尋找其他跡象(來自 JBoss 的元數據對像等)。

引用自:https://serverfault.com/questions/4556