很多情況下,都會出現dump這個字眼,java虛擬機jvm中也不例外,其中主要包括內存dump、線程dump。
當發現應用內存溢出或長時間使用內存很高的情況下,通過內存dump進行分析可找到原因。
當發現cpu使用率很高時,通過線程dump定位具體哪個線程在做哪個工作占用了過多的資源。
首先,內存dump是指通過jmap -dump <pid>輸出的文件,而線程dump是指通過jstack <pid>輸出的信息。
兩個dump可以單獨使用,也可以在特定場合下結合使用。
在linux操作系統下(已安裝jdk),執行jps命令,列出正在運行的java程序的進程ID。
使用top查看目前正在運行的進程使用系統資源情況。
其中進程號為24660的進程,jps輸出列表和top列表中都出現,並且在top列表中顯示是由java COMMAND啟動的。
其中%MEM為2.9,說明占用系統內存為2.9%,當前系統大概8G內存;另外%CPU指的是當前進程使用CPU資源百分比;
【內存dump】
jmap –dump:live,format=b,file=heap.bin <pid>
參考資料:http://docs.oracle.com/javase/6/docs/technotes/tools/share/jmap.html
將生成的heap.bin文件,使用ha456.jar工具打開分析。java -jar -Xmx3000m ha456.jar
【線程dump】
jstack -m <pid> >jvm_deadlocks.txt
jstack -l <pid> >jvm_listlocks.txt
參考資料http://docs.oracle.com/javase/6/docs/technotes/tools/share/jstack.html
使用top -H -p <pid>找出某進程中要分析的線程ID,然后將線程ID轉換為16進制后,在線程dump文件中搜索相關信息