棧和堆內存溢出診斷(二)

棧內存溢出

問題定位

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文件進行分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章