2012-03-14 109 views
0

我在JBoss 6上運行的Java EE 6應用程序最近開始有內存問題。如何解決JBoss中的OutOfMemoryError問題?

形勢

  • 生產服務器。
  • 使用JPA2/Hibernate進行默認緩存設置的中小型應用程序。 〜170班。
  • 數據庫大小〜1.8gb,其中90%屬於二進制數據,由servlet簡單地取回而沒有任何特殊的緩存。
  • 會話超時最近從2個小時增加到10
  • JVM配置:-Xrs -Xms1024m -Xmx1024M -XX:MaxPermSize參數= 512M -Dsun.rmi.dgc.client.gcInterval = 3600000 -server
  • 的JBoss作爲服務運行。
  • 幾乎所有控制器類中ViewScope

兩個問題考慮到這些事實:

  • 我將如何解決這些OOMEs? JConsole未找到作爲服務運行的JVM。理想情況下,我必須能夠檢查諸如會話之類的相關對象以找到記憶小偷。

  • 這個OOME是合法的嗎,考慮到增加的會話超時,解決方案只是增加堆大小?該應用程序自2011年9月以來一直在使用,沒有任何早期的內存問題。會話超時大約在兩個月前大幅增加。

+0

對不起,我之前沒有進一步處理這個問題,現在似乎已經解決了。堆轉儲參數將是一個很好的起點,問題再次出現,將VisualJVM和類似於生產服務器的附件看起來很難。無論如何,我會接受你的答案,因爲它包含堆分析技巧。 – 2012-06-25 12:54:45

回答

1

這似乎是合乎邏輯的會話將使用一定量的內存在JBoss中。增加會話超時可能會導致在任何時候會在內存中出現更多會話 - 所以您可能會增加應用程序的內存需求。

最簡單的(初始)解決方案是增加堆應用程序的分配。例如,設置-Xmx2g(這將JVM內存加倍爲2 GiB - 當前設置爲1 GiB)。顯然,你的系統應該有足夠的物理內存可用。

如果這只是延遲你的OOME,你會想分析你的堆。啓用:

-XX:-HeapDumpOnOutOfMemoryError

這將創建一個堆的物理轉儲,以供分析。你可能會發現你有內存泄漏,或者只是每個應用程序會話都有一定的內存佔用 - 然後要麼限制會話,要麼增加適合的內存分配。

1

VisualJVM是JDK中包含的很棒的工具,您可以使用它來診斷那種錯誤。爲了與JBoss一起工作,您可以查看this

VisualVM有能力提取和分析堆轉儲。在那裏您可以查看所有加載的類,每個類的所有實例以及每個實例的內存分配。有了這些信息,您可以更好地找到問題的原因。