堆內存溢出(java heap space)
發生堆內存溢出一般有兩種情況,一種是內存泄漏,一種是內存不足。
分析原因
- 1:利用
jmap
命令將快照導出
ps: 若是應用啓動參數加了-XX:+HeapDumpOnOutOfMemoryError
參數,直接把hprof
文件導入到mat
工具即可
jmap -dump:format=b,file=youname.hprof pid
- 2:利用
mat
工具分析內存溢出原因
將導出的hprof
文件導入到mat工具中,分析原因,mat下載地址
此時我設置的堆內存只有30m,可以看到,是object[]
數組的實例,佔用了97.44%
的空間
點擊可以查看每個對象的實例個數,以及佔用空間的大小
從GCRoot
看引用的情況(忽略了虛引用,軟引用)情況,對象可達性分析。
cpu負載變高
- 查看cpu情況
top
- 把線程信息打印出來
jstack pid
- 找到該進程中cpu利用率高的線程
top -p pid -H
- 將cpu利用率高的線程id轉化爲16進制
printf “%x pid”
在jstack中查找該線程對應的堆棧信息。