JVM内存模型
2021-05-25 11:05:59 0 举报
由java类编译成字节码文件,经过类加载子系统加载到内存模型(内存模型各个模块及其作用、描述),再由垃圾回收算法及回收器
作者其他创作
大纲/内容
方法出口
初始化
指向常量池中的方法引用【多态,将编译时期没有指明具体实例】
1.给类中静态变量分配空间(赋默认值,比如int类型 就是 0 ,String类型 就是 null)
survivor
Eden(8/10)
操作数栈
from1/10
本地方法栈 Native Method Stack
MarkWord
类型信息
线程【私有】
动态链接
old
类和结构的全限定名字段名称和描述符方法名称和描述符
老年代(2/3)MajorGC
验证
实例数据
用于存放局部变量,基本数据类型直接存放值,引用类型存放引用以变量槽(slot)为最小单位(32位),long、double需要两个slot(64位),所有线程不安全
parellelscavenge
运行时常量池
Class对象(类元信息,属性,方法等)
1.大对象可直接进入老年代(可设置)2.年龄达到15岁3.suvivor区存存活对象,相同年龄的总大小,大于suvivor的一半,大于等于该年龄的所有对象直接进入老年代4.Minor GC后对象太多无法放入suvivor
本地方法库
对象头
与JVM栈类似,是执行native方法所记录的区域
垃圾回收器
准备
语义分析
15岁
数组长度
方法区(元空间 MetaSpace放在本地内存)【共享】
1.将常量池的符号引用替换为直接引用(符号引用理解为一个标识,而直接引用直接指向内存中的地址)
程序计数器
堆 Heap【共享】【垃圾回收主要区域】
文本字符串final常量池基本数据类型值其他
方法表
javac 编译器
1.检查文件格式,元数据,字节码和符号引用等是否正确
垃圾回收 -- GC
sum() 栈帧
复制
抽象语法树
l类型指针
使用
字符串常量池
本地接口
引用计数法引用计数器
1.执行类构造器<clinit>()2.对静态变量和静态代码块执行初始化工作(比如 int num = 1)
局部变量表
HelloWorld.java
serial
符号引用
to1/10
记录出栈地址,或方法返回值地址,或异常信息返回地址
parNew
Java栈Stack
parellel old
标志-清除
类元信息
serial old
G1
解析
词法分析
判断垃圾方法
来回交换其中一个空的
方法信息
TLAB线程私有
记录当前线程执行字节码的行号,以便切换线程恢复到正确的执行位置【如果是native方法,则为空】唯一一个没有定义OOM的区域
Class实例引用
CodeCacheJIT编译代码产物
程序计数器 PC
卸载
CMS
类加载器引用
运行时数据区
标志-整理
类型的常量池
main() 栈帧(stack frame)...
连接
用来计算临时数据存储的区域,使用load指令,将数据加载进来
yong
新生代(1/3)MinorGC
存储内容(62bit)
标志位2bit
锁状态
01
无锁
偏向锁
调用栈中锁记录的指针(62bit)
00
轻量级锁
重量级锁的指针(62bit)
10
重量级锁
空
11
GC标志
字面量
垃圾回收算法
数组
语法分析
注解抽象语法树
类加载子系统
执行引擎
加载
字节码生成器
本地方法栈
HelloWorld.class
字段信息
可达性分析GC Roots根
对象
1.获取类的二进制字节流2.将静态结构转化为方法区运行时数据结构3.内存中生成类对象,作为数据入口
对齐填充-8字节倍数
0 条评论
回复 删除
下一页