简谈JVM

JVM运行时数据区域分类

程序计数器:当前线程所执行的字节码的行号指示器
Java虚拟机栈:描述的是Java方法执行的内存模型,相当于业务逻辑。每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出入口等
本地方法栈:为虚拟机用的Native方法服务
Java堆:储存对象实例,相当于数据存储
方法区:存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据
运行时常量池:用于存放编译期生成的各种字面量和符号引用
直接内存:不是虚拟机运行时数据区一部分,也不是java虚拟机规范中定义的内存区域,但是这部分内存也被频繁的使用,而且可能导致OutOfMemoryError异常

JVM调试与分析

  1. 参数-XX:+HeapDumpOnOutOfMemoryError,可以让虚拟机在出现内存溢出时Dump出当前的内存转储快照以便事后进行分析;
  2. 使用-Xss参数减少栈内存容量,结果:抛出StackOverflowError异常,异常出现时输出的栈的深度相应缩小;如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常
    ,如果虚拟机在扩展时无法申请到足够的内存空间,则抛出OutOfMemoryError异常 ;
  3. -XX:PermSize和-XX:MaxPermSize限制方法区大小,从而间接限制其中常量池的容量;
  4. DirectMemory容量可通过-XX:MaxDirectMemorySize指定,如果不指定,则默认与Java堆最大值-Xmx一样;

猜你喜欢

转载自blog.csdn.net/u012869196/article/details/75547767