基于WebSphere 構建的企業(yè)應用,時(shí)常會(huì )出現性能問(wèn)題,在嚴重的情況下還會(huì )提示出內存溢出,這是一件很讓人惱怒的事情。在WebSphere Application Server(Was)運行的時(shí)候,內存溢出,會(huì )生成大量的溢出文件,如Javacore, Heapdump等文件,占用了大量的磁盤(pán)空間。在這種情況下,時(shí)常會(huì )出現一連串的系統問(wèn)題,如部署在Was的所有應用服務(wù)都報錯,Was連控制臺也無(wú)法訪(fǎng)問(wèn)等。
為解決問(wèn)題,我們通常會(huì )選擇重新啟動(dòng)整個(gè)Was或者服務(wù)器,然后分析運行日志SystemOut.log、ystemErr.log、ative_stdout.log、native_stderr.log 和系統內存溢出的時(shí)候產(chǎn)生的Javacore、Heapdump文件來(lái)尋找出問(wèn)題。
如果我們在測試中發(fā)現系統運行一段時(shí)間后響應開(kāi)始緩慢,但Was又沒(méi)有掛掉時(shí),就可以通過(guò)人工操作產(chǎn)生JavaCore、Heapdump等文件,通過(guò)對相關(guān)文件、日志的分析來(lái)查找系統是否存在內存溢出的隱患。
下面介紹一下產(chǎn)生JavaCore、Heapdump文件的方法——websphere的dump命令。
一、Linux平臺
大致步驟:
1)進(jìn)入WAS安裝目錄的bin目錄,如果是WAS6.0, 請進(jìn)入所在profile的bin目錄;
2)執行wsadmin.sh進(jìn)入WSADMIN命令行方式提示符會(huì )變成wsadmin>
3) 執行以下命令:(注意將server1改為你的server的名字,兩個(gè)逗號之間沒(méi)空格)
a) 設置jvm環(huán)境變量:wsadmin> set jvm [$AdminControl queryNames type=JVM,process=server1,*]
b) 生成javacore文件:wsadmin> $AdminControl invoke $jvm dumpThreads
c) 退出WSADMIN命令行:wsadmin> quit
執行完后將在was安裝目錄或所在profile的目錄下產(chǎn)生JavaCore文件,通過(guò)分析JavaCore以及相關(guān)的SystemOut,SystemErr和nativestd_err等文件可以得知系統gc是否正常,是否存在有內存溢出的情況。
具體操作:
--進(jìn)入bin目錄
[root@csspvm bin]# pwd
/opt/IBM/WebSphere/WAS6.1/profiles/AppSrv01/bin
--進(jìn)入WSADMIN命令行方式
[root@csspvm bin]# ./wsadmin.sh -username root -password root
WASX7209I: Connected to process "server1" on node csspvmNode02 using SOAP connector; The type of process is: UnManagedProcess
WASX8011W: AdminTask object is not available.
WASX7029I: For help, enter: "$Help help"
--設置jvm環(huán)境變量
wsadmin>set objectName [$AdminControl queryNames WebSphere:type=JVM,process=server1, node=webNode01,*]
WebSphere:name=JVM,process=server1,platform=proxy,node=csspvmNode02,j2eeType=JVM,J2EEServer=server1,version=6.1.0.0,type=JVM,mbeanIdentifier=JVM,cell=webNode01Cell,spec=1.0
--生成heapdump文件
wsadmin>$AdminControl invoke $objectName generateHeapDump
/opt/IBM/WebSphere/WAS6.1/profiles/AppSrv01/./heapdump.20100904.075650.3576.phd
wsadmin>set jvm [$AdminControl queryNames WebSphere:type=JVM,process=server1,node=webNode01,*]
--生成JavaCore文件
wsadmin>$AdminControl invoke $jvm dumpThreads
wsadmin>quit
--"webNode01"為websphere節點(diǎn)名稱(chēng)。
取線(xiàn)程:JavaCore
set objectName [$AdminControl queryNames WebSphere:type=JVM,process=server1,node=webNode01,*]
set jvm [$AdminControl queryNames WebSphere:type=JVM,process=server1,node=webNode01,*]
$AdminControl invoke $objectName dumpThreads
$AdminControl invoke $jvm dumpThreads
取堆棧:heapdump
wsadmin -user admin -password zxin10 -c "$AdminControl invoke [$AdminControl queryNames WebSphere:type=JVM,process=server1,node=webNode01,*] generateHeapDump"
$AdminControl invoke $jvm generateHeapDump
$AdminControl invoke [$AdminControl queryNames WebSphere:type=JVM,process=server1,node=webNode01,*] generateHeapDump
二、 Windows平臺
在Windows 下,生成JavaCore與HeapDump的方式比較簡(jiǎn)單。
1 使用Ctrl+Break
如果WebSphere是在命令行窗口啟動(dòng),有啟動(dòng)命令行窗口,那么可以通過(guò)在命令行窗口中使用Ctrl+Break鍵,產(chǎn)生JavaCore和HeapDump。
2 調用程序
IBM 的JDK提供了接口,通過(guò)調用這個(gè)接口,可以直接生成JavaCore以及 HeapDump。
生成JavaCore:
調用JSP文件,jsp中只有一行語(yǔ)句,如下所示
<%
com.ibm.jvm.Dump.JavaDump();
%>
生成HeapDump
調用JSP文件,jsp中只有一行語(yǔ)句,如下所示
<%
com.ibm.jvm.Dump.HeapDump();
%>
調用方法后將在was安裝目錄或所在profile的目錄下產(chǎn)生相關(guān)JavaCore、Heapdump文件。
好了,到這里學(xué)會(huì )了如何產(chǎn)生JavaCore、Heapdump文件,問(wèn)題又來(lái)了:怎么分析產(chǎn)生的JavaCore、Heapdump文件呢?后面會(huì )為繼續寫(xiě)”JavaCore、Heapdump文件分析方法”。
聯(lián)系客服