JVM结构剖析
工具: jvisualvm jdk本地Java线程识别,内存的分析工具 jvisualvm安装Visual GC插件可以清楚看到GC的动态操作流程
GC:STW, stop the work,调优是为了减少GC次数,即减少stop the work次数,提高用户体验;优先调优Full GC,
性能测试之jvisualvm监控分析
http://www.51testing.com/html/38/n-3724238.html
栈
类一个方法对应一个栈帧,一个栈帧有
局部变量表,操作数帧,动态链接,方法出口信息;
局部变量包括八大基本类型,对象引用,返回地址(returnaddress);
一个线程对应建一个虚拟机栈,运行一个方法,则对应压栈(虚拟机栈)一个栈帧,
运行结束后出栈(出虚拟机栈),所以正在运行的方法一定在栈顶部;
那么,方法内部调用方法,则会先压栈第一个方法后继续压栈第二个被调用的方法,
当前虚拟机栈就有2个栈帧,方法没执行完所以不能出栈,以此类推,如果不断的增加调用方法(调用方法深度很深),虚拟机能存的栈帧数量也有最大值,
当压栈(增加栈帧),
超过虚拟机栈最大的数量 就会发生**StackOverflowError**
局部变量表:
存放局部变量
存放堆对象的引用(指针)
操作数栈:
运算也需要分配内存栈
堆
存放对象
GC,
minor GC 15次后变 老年代
静态变量,连接池等 不会清
Eden,survivor ,OLD
对象头?
内存不够时则会发生OOM
本地方法栈
native 修饰的本地方法运行用到的内存栈
方法区(元空间)
存放类信息,常量,静态变量
程序计数器
计数器,是用记录当前线程运行的行号,多线程运行的,
一个线程暂停后运行另外的线程再回到原来线程时根据计数器记录的行号继续原来的程序。
JVM可以分为
共享区(出现OOM区域)
堆,方法区;
线程私有
虚拟机栈,本地方法栈,程序计数器
单线程:虚拟机栈,本地方法栈 可能出现StackOutflowError
多线程:虚拟机栈,本地方法栈 可能出现StackOutflowError ,OOM
程序计数器 ,无内存溢出异常