JVM 学习 (02_day)

一、虚拟机栈
1、栈内存溢出(Java.lang.*Error)
原因:

  • 栈帧过多导致栈内存溢出(无线递归)
  • 栈帧过大导致栈内存溢出
    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);
    }
}
运行程序后,开始如下操作: 1、在teminal输入jps,找到程序运行的进程号 2、输入 jmap -heap 5596

另一虚拟机内存可视化工具:jvisualvm

上一篇:C++ 常量


下一篇:数据结构 day 2