JVM 学习 (02_day)
一、虚拟机栈
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