JVM基本原理
2021-03-08 10:12:10 0 举报
图解JVM
作者其他创作
大纲/内容
public int add(){ int a = 1; int b = 10; int c = a + b; return c;}
Survivor2区(占十分之一)当Eden区触发GC,清理当前区时无引用的直接清理,有引用的会挪到Survivor1区,并且分带年龄加1,Survivor区内的对象每次GC都会相互转移
类装载系统
堆中的对象实例指向元空间的类元信息
本地方法栈主要是存放程序执行所依赖的底层c++代码执行过程中的变量等信息
元空间内的静态变量是堆中实例对象的内存地址
动态链接将符号引用转为直接引用
老年代(默认占堆内存三分之二)当Survivor区对象年龄达到15,对象会转移至老年代中,full gc后仍无可用空间 抛出堆内存溢出异常
栈内存空间每个方法对应开辟一块栈帧栈帧中保存方法的局部变量整个栈内部全部为压栈结构
只要触发gc,jvm都会执行 STW(stop the world,停止当前所有用户线程)
年轻代(默认占中堆内存三分之一)
操作数栈方法内变量的值例如 1、10、以及运算后的值11
当年轻代无法存入对象后,垃圾回收线程执行minor gc
public static void main(String[] args){ add();}
元空间(方法区)保存常量、静态变量、类信息编译后的代码放在运行时常量池中
java的代码编译后其实是在常量区的一些符号,在加载到方法区时,动态链接会将符号转为符号所在区域的内存地址
当老年代无可用内存后触发full gc
Survivor1区(占十分之一)第一次放入进来的对象分带年龄为1,当Eden区再次触发GC,还会同时清理Survivor区,清理当前区时无引用的直接清理,有引用的会挪到Survivor2区,并且分带年龄加1
一开始变量表只有变量,没有对应的值如果变量是引用对象类型,那么在变量表存的实际是对象在堆中的内存地址c=11;b=10;a=1;
变量对应的值会先加载到操作数栈中,一次只加载一个,将1赋值给a后1就出栈了101
堆内存空间保存创建的对象实例
字节码执行引擎
每执行完一行代码都会去修改对应计数器的值
程序计数器每一个java方法都对应一个程序计数器程序计数器主要用来记录方法执行到哪一步的位置
JVM内存模型
方法中的对象引用变量指向堆中对象实例
Eden区(默认占年轻代十分之八)新创建出来的的对象首先放在这里,GC会通过GCRoot清理无引用对象,对于有引用的对象会放入Survivor区
Java类.class
栈帧1对应的方法
堆内存结构
方法出口add()方法由main方法调用,add方法执行完毕,回到main方法,方法出口就记录了方法调用完应该回到什么位置
栈帧1add()
栈帧Nmain()
局部变量表保存方法内定义的变量例如 a、b、c
栈内存内部
0 条评论
下一页