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);
    }
}
运行程序后,开始如下操作: 1、在teminal输入jps,找到程序运行的进程号 2、输入 jmap -heap 5596

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

相关文章

jinfo 命令可以用来查看 Java 进程运行的 JVM 参数,命令如下...
原文链接:https://www.cnblogs.com/niejunlei/p/5987611.ht...
java 语言, 开发者不能直接控制程序运行内存, 对象的创建都是...
jvm
1.jvm的简单抽象模型:  2.类加载机制     双亲委派模...
堆外内存JVM启动时分配的内存,称为堆内存,与之相对的,在代...
1.springboot和tomcat2.springcloud的请求如何通过网关鉴权?...