2012-03-15 109 views
1

在生產中,我們有一個CentOS 5 Linux機箱,它運行Apache 1.6.0_21上的多個Apache Tomcat 5.5.30實例。每個Tomcat都託管一個Java EE WebApp,它從Postgres 9.1 RDBMS中提取數據並生成HTML/PDF /等報告。

每隔幾天,由於觸發器尚未確定,其中一個Java進程將開始增加內存使用量(幾十個演出),直到機器開始將內存分頁爲HD,從而使整個服務器到達一個靜止的。 我通常會使用JProbe來監視對象正在消耗的所有內存,但由於服務器是無頭Linux安裝,這不是一個選項。

是否有一個無頭(CLI)工具可以定期記錄哪些Java對象消耗的內存最多?這甚至是診斷問題的最好方法嗎?如何診斷與生產linux內存相關的Java崩潰問題

UPDATE: 使用以下收到的反饋,我意識到問題的一部分是,我們沒有得到實際的碰撞,但流程剛剛頁面RAM到HD直到整個機器變得反應遲鈍。這個(我想)的一個解決方案是設置-Xmx參數,以限制Java可以使用的最大內存容量爲幾GB。不幸的是,JVM看起來好像忽略了這個設置,並且儘可能多的消費而不會崩潰。是否有另一種強制執行限制的方法?

+0

你可以告訴JVM和操作系統版本。 – 2012-03-16 03:29:51

+0

另外,請做一個ps -el | grep java併發送傳遞給進程的最終參數。 – 2012-03-16 04:20:38

回答

0

有幾種方法可以解決這個問題。

顯然的第一步是使垃圾收集日誌記錄(添加像-verbose PARAMS:GC -Xloggc:/path/to/gc.log -XX:+ PrintGCDetails等)

接着在線路是JDK工具(帶有visuagc插件的jvisualvm)和jmap(jmap -histo可以讓你在活動對象上運行)。是的,jvisualvm是一個GUI工具,但是我認爲你可以做X前進。

不介意自己撥弄一下嗎?爲什麼不爲你的關鍵類和方法編寫BTrace探針?

仍然沒有足夠的信息?可能想嘗試像AppDynamicsLite這樣的工具(免費從一個商業分拆.. http://www.appdynamics.com/products-free-download.php

這是我爲工作帶來的一種工具包。

+0

您可以使用[GCViewer](http://www.tagtraum.com/gcviewer.html)幫助分析GC日誌。該網站還有關於如何解決內存問題的其他技巧。 – radimpe 2012-03-15 17:56:17

1

在這裏我看到兩個問題:

  1. 你的VM不會頁面,除非可用的RAM <最大堆定義。因此,請確定最大堆定義少於可用RAM(總RAM - 所有其他進程使用的RAM)
  2. 接下來,假設您看到OutOfMemoryErrors,plesae通過添加JVM參數-XX:+在OOME上啓用堆轉儲HeapDumpOnOutOfMemoryError
  3. 當您下次遇到問題時,您將獲得堆轉儲,可以使用Eclpise MAT或Yourkit分析器分析堆轉儲,以查看填滿內存的內容。這將告訴你代碼的哪一部分實際上導致了問題。