很多情況下,都會出現dump這個字眼,java虛擬機jvm中也不例外,其中主要包括內存dump、線程dump。
當發現應用內存溢出或長時間使用內存很高的情況下,通過內存dump進行分析可找到原因。
當發現cpu使用率很高時,通過線程dump定位具體哪個線程在做哪個工作占用了過多的資源。
首先,內存dump是指通過jmap -dump <pid>輸出的文件,而線程dump是指通過jstack <pid>輸出的信息。
兩個dump可以單獨使用,也可以在特定場合下結合使用。
在linux操作系統下(已安裝jdk),執行jps命令,列出正在運行的java程序的進程ID。
ps aux|grep java|sort -k4,4nr|head -n3 可查看 tomcat前三占用內存
jmap -dump:live,file=wx.dump <pid> 可以下載內存 dump 只dump存活的
jmap -dump:format=b,file=wx.dump <pid> 使用hprof二進制形式,輸出jvm的heap內容到文件用jmap把進程內存使用情況dump到文件中
【線程dump】
jstack -m <pid> >jvm_deadlocks.txt
jstack -l <pid> >jvm_listlocks.txt
-l long listings,會打印出額外的鎖信息,在發生死鎖時可以用jstack -l pid來觀察鎖持有情況
-m mixed mode,不僅會輸出Java堆棧信息,還會輸出C/C++堆棧信息(比如Native方法)
ps -Lfp <pid> 或top -Hp <pid> 可以查看耗時最長的線程
可參考http://www.open-open.com/lib/view/open1390916852007.html