2012-10-03 19 views
2

我試圖調試內存不足錯誤。當我用Jmap做堆轉儲並用Eclipse Mat分析結果時 - 我看到以下內容。如何調試Web應用程序中的OutOfMemoryException

7,677 instances of "java.lang.Class", loaded by 
"<system class loader>" occupy 48,094,720 (23.99%) bytes. 

最大的實例:

class blah.BlahService$$EnhancerByCGLIB$$4a0a7d43 @ 0x2aaab06d9668 
- 2,067,096 (1.03%) bytes. 

BlahService是@Service註解彈簧的服務。所有的服務類別在春天都是單身人士 - 每個國際奧委會每個人一個服務類別 - 那麼爲什麼這個班級會成爲最高級的嫌犯。

我也看到

One instance of "org.apache.jasper.servlet.JspServlet" loaded by 
"org.apache.catalina.loader.StandardClassLoader @ 0x2aaac17bc260" occupies 42,724,168 
(21.31%) bytes. The memory is accumulated in one instance of 
"java.util.concurrent.ConcurrentHashMap$Segment[]" loaded by "<system class loader>". 

這是什麼意思?

+0

您只顯示佔用少於100 MiB內存的對象。這對於Tomcat應用程序來說並不多。你難道沒有看到其他渴望記憶的東西嗎?也許你應該增加堆大小('-mx'),對Tomcat/Spring來說默認值太低。 –

+0

你的意思是** OutOfMemoryError **? Java API中不存在OutOfMemoryException。 這不是一個例外,而是一個錯誤,我認爲你不能從中恢復。 –

回答

0

是的,當爲修復它而爲時已晚時,會出現錯誤,因爲一旦堆積滿了,JVM根本無法做任何事情,因爲它無法創建對象來執行某些操作,換句話說, ,因爲你使用的是Spring,我猜你正在做一個Web系統,在這種情況下,你所要做的就是在deploy命令的開始部分給出更多的堆空間(類似'-Xms:256'),並且計劃你的應用程序需要多少資源,因爲這是事實,如果內存被填滿,系統將崩潰

1

OutOfMemoryError通常表示以下兩個問題之一: 1.您的內存太少你的應用需求。然後,您需要使用Xmx啓動參數 來增加服務器的堆大小。或者,您的應用程序或其中一個使用的第三方庫中存在內存泄漏。沒有先前的經驗,跟蹤內存泄漏並非易事。我可以推薦​​。這是非常容易使用和精確的工具來監視內存泄漏。

0

我已經使用java分析器,但我不滿意輸出的實際性能調整和內存使用情況,目前我們已切換到java melody。這不僅有助於開發中的性能優化,還有助於生產系統的性能優化Java旋律非常易於集成和配置,在生產中,您可以通過更新web.xml來啓用或禁用該功能。

相關問題