1. 程式人生 > >IBM Websphere培訓3——JVM相關引數配置和問題診斷

IBM Websphere培訓3——JVM相關引數配置和問題診斷

1.Websphere JVM相關問題診斷:

由JVM引起的Websphere問題主要有應用伺服器宕機和效能下降,JVM相關問題的特徵如下:

(1).Websphere應用伺服器停止響應:

a.Websphere伺服器宕機。

b.Websphere程序掛起。

c.JVM記憶體溢位。

(2).效能下降:

JVM程序號(process Id)不停地改變。

2.診斷JVM相關問題所需檔案:

(1).核心檔案(Core files):

a.程序快照或者系統的核心檔案。

b.完整的JVM記憶體快照等。

注意:檔案非常龐大,需要ISA(IBM Support Assistant)的日誌分析工具解析。

(2).javacore檔案:

a.正在執行的Java程序的快照。

b.Websphere應用伺服器發生錯誤時自動生成的檔案。

儲存路徑為:<WAS_install_root>/profiles/<profile>。

(3).JVM詳細的垃圾回收器日誌。

(4).JVM堆快照。

3.JVM垃圾回收器日誌:

(1).設定Websphere中JVM垃圾回收器步驟:

在Websphere管理控制視窗點選:Servers->Application servers-><server_name>->Javaand Process Management ->Process Definition->Java Virtual Machine,勾選” Verbose Garbage Collection ”複選框,重啟Websphere即可。

(2).JVM詳細的垃圾回收器日誌寫在系統錯誤日誌檔案中(native_stderr)。

(3).在產品釋出以後,推薦將Websphere的JVM垃圾回收器日誌開啟,它消耗資源非常的少。

4.JVM關於堆的相關引數設定:

(1).JVM最大的堆記憶體大小(maximum heap, -Xmx):

設定合理的最大堆有助於JVM優化效能,最大堆越大,JVM垃圾回收器收集一次垃圾花費的時間越長;最大堆越小,JVM垃圾回收器執行很頻繁。

合理的最大堆應該是稍微大於當程式執行穩定時所需的最大堆容量。

(2).JVM初始化堆記憶體大小(minimum heap,-Xms):

設定合理的最小堆可以提高Websphere應用伺服器的啟動時間。

最小堆太小,JVM可能在伺服器啟動重新過程不斷調整重新設定最小堆,從而影響啟動速度。

最小堆太大,垃圾回收器需要回收較大的記憶體空間,容易產生記憶體碎片。同時由於初始堆記憶體太大,分配堆記憶體花費的時間比較大,程式響應速度慢。

5.JVM垃圾回收器效能指標:

垃圾回收器是JVM中引起記憶體效能瓶頸的主要原因,JVM的垃圾回收器效能指標:

(1).吞吐量(Throughput):

指JVM沒有花費在垃圾回收器上的百分比,即JVM在處理程式執行所花費時間佔整個JVM執行時間的百分比。

(2).暫停(Pauses):

指JVM垃圾回收器執行時間的百分比,即因為JVM垃圾回收器執行而暫停應用程式處理時間佔整個JVM執行時間的百分比。

6.Websphere中JVM垃圾回收器的回收策略(GC policy):

(1). –-Xgcpolicy:optthruput

讓JVM儘可能花最多時間處理應用程式,儘量減少垃圾回收器的執行時間。

(2). –-Xgcpolicy:optavgpause

讓JVM儘可能多回收垃圾,當不可預知的情況發生時,應用程式響應時間比較快。

(3). –-Xgcpolicy:gencon

適合於應用程式需要大量分配堆記憶體給短存活週期物件的情況,垃圾回收器使用分代複製演算法,讓垃圾回收器儘快回收已經死亡的年老代物件。

(4). –-Xgcpolicy:subpool

適合於應用程式在多個執行緒中頻繁給大物件分配堆記憶體的情況。

7.通過JVM執行緒快照診斷程序掛起問題:

當懷疑JVM程序掛起時,以下的方法可以幫助診斷JVM程序掛起相關問題:

(1).收集JVM執行緒快照或者JavaCore檔案:

Websphere預設是開啟的,也可以在命令列(linux)中通過”kill -3”向Websphere傳送訊號產生JVM執行緒快照和JavaCore相關檔案。

(2).當程序掛起時,每個幾分鐘收集一下JVM執行緒快照:

當程序掛起產生時,需要每個幾分鐘收集一下JVM執行緒快照,以幫助分析程序內部的執行情況。

(3).手動或者通過ISA的執行緒分析器檢視JVM執行緒快照檔案:

a.檢查是否有執行緒死鎖產生。

b.檢查所有傳送請求後等待響應的執行緒執行情況。

8. 通過JVM JavaCore檔案診斷程序掛起問題:

檢視javacore檔案主要根據執行緒的執行狀態進行相應的問題診斷:

(1).執行緒處於阻塞狀態:

a.無法訪問的資源,或者邏輯錯誤的執行緒同步都有可能導致執行緒被阻塞。

b.死鎖也可能導致執行緒被阻塞。

(2).執行緒處於執行狀態:

a.通過多個javacore檔案檢查方法的呼叫堆疊。

b.如果一個方法內產生很多執行緒,有可能方法的迴圈邏輯有問題。

(3).執行緒處於等待狀態:

執行緒可能因為等待資源被掛起。

9.Websphere中執行緒掛起診斷:

Websphere中包含了探測執行緒掛起的功能,它不會去殺掉掛起的執行緒,只會通過以下3種方式通知執行緒掛起:

(1).向JMX監聽器傳送JMX通知,通過第3方的工具捕獲JMX事件處理執行緒掛起。

(2).通過執行緒池流量監測系統向PMI客戶傳送執行緒掛起通知。

(3).向Websphere的SystemOut.log日誌中寫執行緒掛起的訊息,格式如下:

[4/17/04 11:51:30:243 EST] 2d757854 ThreadMonitor W CWWSR0605W:     ThreadServlet.Engine.Transports : 0 has been active for 14,198    milliseconds and may be hung. There are 1threads in total in the server that   maybe hung.

(4).當之前一個執行緒被報告為掛起,如果執行緒又正常執行後,Websphere會向SystemOut.log日誌中寫執行緒正常執行的訊息,格式如下:

[2/17/04 11:51:47:210 EST] 76e0b856 ThreadMonitor W WSVR0606W:ThreadServlet.Engine.Transports : 0 was previously reported to be hung     but has completed. It was active forapproximately 31,166 milliseconds.Thereare 0 threads in total in the server that still may be hung.

(5).Websphere的監控器對於執行緒掛起的判定和警告處理可以智慧調節,即如果前一次產生的執行緒掛起告警後來證實是正常執行的,則Websphere會相應調整判定條件。

10.Websphere宕機問題症狀和常見原因:

Websphere宕機時的主要表現為:Websphere程序因為java異常或者作業系統本地訊號而終止執行。

Websphere宕機的常見原因:

(1).JVM記憶體溢位異常。

(2).JVM棧溢位。

(3).無法預知的其他異常情況,如磁碟空間不足等。

(4).JVM效能優化失敗,如由JIT引起的問題。

(5).Java本地方法呼叫(JNI)產生錯誤,或者類庫產生問題。

(6).JVM呼叫本地機器碼執行時,產生記憶體段衝突。

11.Websphere宕機問題診斷:

(1).Core檔案:

a.程序快照和系統的核心檔案。

b.二進位制格式的完整的虛擬記憶體快照檔案。

注意:core檔案可能非常大,另外有些是二進位制格式不可讀,因此需要使用ISA的日誌分析工具解析。

(2).JavaCore檔案:

Java的記憶體快照檔案和執行緒快照檔案。

(3).為JVM配置–Xdump引數:

可以指定產生系統快照、java快照和對記憶體快照。

13.Websphere記憶體溢位常見原因:

記憶體溢位產生是指JVM沒有足夠的記憶體空間為物件分配記憶體,常見原因如下:

(1).JVM的java堆太小。

(2).JVM中記憶體空間是夠用的,但是都是零散的,即沒有一塊的容量可以符合新產生物件的堆記憶體需求(在JDK1.4.2及其以前版本中很常見)。

(3).java程式碼導致的JVM記憶體洩漏。

(4).機器本身記憶體不夠用。

14.記憶體溢位問題診斷方法:

(1).首先分析javacore檔案中記憶體相關的問題。

a.檢查堆記憶體大小資訊。

b.檢視記憶體溢位異常棧。

(2).分析垃圾回收器產生的檔案和堆資訊:

a.檢查垃圾回收器的詳細日誌。

b.檢視對記憶體快照。

15.Websphere記憶體溢位症狀:

(1).JVM堆記憶體經常以恆定的增長速度不停的增長,直到達到最大堆記憶體值。

(2).JVM堆記憶體從來沒有處於一個穩定的狀態。

16.Websphere記憶體溢位診斷和解決方法:

(1).Websphere管理控制檯視窗增大JVM最大堆記憶體值(Xmx),方法如下:

在Websphere管理控制檯視窗點選:Servers -> Application Servers -> server-> Java and ProcessManagement -> Process Definition -> Java VirtualMachine -> Maximum heap size。

(2).檢查JVM詳細的垃圾回收器日誌,審查記憶體分配失敗原因:

a.找到因為記憶體溢位引起的記憶體分配失敗。

b.檢查被分配堆記憶體物件的大小。

c.確認JVM的堆記憶體大小。

d.檢視JVM堆記憶體空閒利用率(JVM堆沒有被分配使用總整個JVM堆的百分比)。

(3).檢查之前類似的記憶體分配失敗問題:

a.如果持續產生記憶體分配失敗的問題,則JVM堆太小,需要增加JVM堆大小。

b.如果是偶爾因為為一個大物件分配記憶體失敗,是個獨立的事件,則考慮綜合的解決方案。

17.Websphere監控和調整堆記憶體大小:

在Websphere管理控制檯視窗點選:Servers -> Application Servers -> server-> Java and ProcessManagement -> Process Definition -> Java VirtualMachine -> Maximum heap size後開啟如下介面:

根據JVM中使用的堆記憶體(上圖中橘黃色的線),調整JVM最大堆記憶體值(上圖中紅色的線),直到JVM中使用的堆記憶體趨於穩定為止(橘黃色的線趨於平穩),且JVM最大堆記憶體稍微大於使用的堆記憶體值(紅色的線稍微高雅平穩後橘黃色的線)。

當前配置:最小堆疊 256  最大堆疊 3072 目前系統穩定