2017-09-13 71 views
0

我有一個企業應用程序,我正在工作,目前它在分段環境。服務器有24 GB的RAM。但是,在服務器日誌平均15-20天后,我們發現服務器日誌中的內存空間不足。我使用J2EE,spring,hibernate,memcache,ehcache,mysql和tomcat8。 我已經使用nginx進行集羣,並且有3個tomcat服務器節點。在一個月內兩次出現空間不足錯誤。 java

請建議/幫助我該做什麼,因爲我無法追蹤/得到這個錯誤來自哪裏以及從哪裏發生這種內存泄漏。

感謝

+1

有沒有知道什麼可以在應用程序中發生的事情不知道它具體明確的方式。您需要獲取堆轉儲並分析它。 – Swapnil

+0

感謝您的意見。讓我得到並分析轉儲,並會盡快回復。 – Rana

回答

0

以使用how-to-collect-a-heap-dump堆轉儲,使用稱爲Mat日食的工具進行分析。這將爲您提供清晰的內存圖片,並讓您知道代碼中發生了哪些問題導致了OOM錯誤。

+0

感謝您的意見。讓我得到並分析轉儲,並會盡快回復。 – Rana

1

您的程序有可能在堆中分配許多對象,並且決不允許垃圾收集器釋放它們。

爲了診斷,你可以做你的服務的一個堆轉儲,這是用命令來完成:

jmap -dump:format=b,file=dump.bin <pid> 

其中<pid>是您的Java服務的進程ID(您可以用命令ps faux | grep java找到) 。

然後,您可以通過VisualVM打開文件dump.bin並檢查它以查看哪些對象正在使用大部分堆。

因爲堆轉儲很大並且會包含可以進行垃圾收集的對象,所以您可能希望告訴jmap只將不能被垃圾收集的那些對象放入堆轉儲中,這會添加標誌livejmap命令:

jmap -dump:live,format=b,file=dump.bin <pid> 

以下是使用VisualVM的檢查堆轉儲說明:https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/heapdump.html

+0

感謝您的輸入。讓我得到並分析轉儲,並會盡快回復。 – Rana

相關問題