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 目前系統穩定