栈内存溢出:
问题定位
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文件进行分析