一、虚拟机栈
1、栈内存溢出(java.lang.stackOverflowError)
原因:
- 栈帧过多导致栈内存溢出(无线递归)
- 栈帧过大导致栈内存溢出
2、线程运行诊断
cpu占用过高
Linux环境下运行某些程序的时候,可能导致cpu的占用过高,这时需要定位占用cpu过高的线程 - top命令,查看是哪个进程占用cpu过高
- ps H -eo pid, tid(线程id), %cpu | grep 刚才通过top查到的进程号 通过ps命令进一步查看是哪个线程占用cpu过高
- jstack 进程id 通过查看进程中的线程的nid,刚才通过ps命令看到的tid来对比定位,注意jstack查找出的线程id是16进制的,需要转换
二、本地方法栈
带有native关键字的方法就是需要JAVA去调用本地的C或者C++方法,因为JAVA有时候没法直接和操作系统底层交互,所以需要用到本地方法
三、堆(heap)
定义:通过new关键字创建的对象都会被放在堆内存
特点 - 所有线程共享,堆内存中的对象都需要考虑线程安全问题
- 有垃圾回收机制
堆内存溢出(java.lang.OutofMemoryError :java heap space):
堆内存诊断: - jps工具:查看当前系统中有哪些java进程
- jmap工具:查看堆内存占用情况
- jconsole工具:图形界面的,多功能的监测工具,可以连续监测
代码演示:
点击查看代码
public class Demo_02 {
public static void main(String[] args) throws InterruptedException {
System.out.println("1.....");
Thread.sleep(30000);
byte[] bytes = new byte[1024 * 1024 * 10];// 10M
System.out.println("2.....");
Thread.sleep(30000);
bytes=null;
System.gc();
System.out.println("3.....");
Thread.sleep(1000000L);
}
}
另一虚拟机内存可视化工具:jvisualvm
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。