棧內存溢出:
問題定位
1.cpu佔用過多
定位:
- 用top定位哪個進程對cpu佔用過高
- ps H -eo pid,tid,%cpu | grep 進程id(定位是哪個線程引起的cpu)佔用過高
- jstack進程id 可以根據線程id找到有問題的線程,進一步定位到問題代碼的源碼行號
堆內存診斷:
定位問題的方法可以參考如下方式:
public class Demo {
public static void main(String[] args) throws InterruptedException{
System.out.println("1...");
Thread.sleep(30000);
byte[] array = new byte[1024*1024*10] ;
System.out.println("2.....");
Thread.sleep(30000);
args = null ;
System.gc();
System.out.println("3.....");
Thread.sleep(1000000L);
}
}
1.idea命令行窗中輸入>jps
會打印出當前系統有哪些java進程,找到Demo的進程
2.輸入>jmap
可以查看某時刻堆內存佔用情況
這裏還可以通過命令>jmap -dump:format=b,live,file=1.bin 21111(數字是線程id)
在抓取快照之前進行一次垃圾回收 格式化是二進制,存活的對象,文件名是1.bin
3.輸入>jconsole命令
會打開圖形界面,連續監測
4.輸入>jvisualvm
可視化方式展示虛擬機的情況,通過堆dump文件進行分析