JVM内存模型完整版
2021-07-01 16:10:17 1 举报
基于Oracle JVM内存模型
作者其他创作
大纲/内容
字符串常量池
栈帧(main)
动态链接(多态 编译期没有指明运行时才能指明对象 指向常量池中方法的引用)
操作数栈
运行时常量池
HelloWord.class
javac编译器
CodeCacheJIT编译产物
类型的常量池
引用计数
Serial(串复制)
数组长度(数组)
本地接口
数组
垃圾判断算法
执行引擎
方法出口
reference
实例数据
类型信息
抽象语法树
堆
8大基本类型
1 字面量; 1文本字符串 2 final常量值 3 基本数据类型 3 符号引用
根节点枚举算法
用于存放boolean byte char short int float long double 种类型的数据 以变量槽(slot)为最小单位32位 long double需要2个slot 所以线程不安全 基本数据类型会直接存值 引用数据类型会存放对象的引用
Eden(8/10)
MarkWord
Form Survivors0(1/10)
由于CPU执行指令是可中断的 会有线程切换 线程计数器会记录当前线程执行的字节码指令地址(行号) 以便线程切换后能回复到正确的执行位置
CMS(并发清除)
垃圾收集--GC
TLAB: 在Eden区开辟的每一个线程私有的很小的缓存空间 (Thread Local Allocation Buffer) 线程需要创建对象 只要TLAB空间猪狗就可在此空间创建
老年代(2/3)(MojorGC)
可以理解为用于计算的临时数据存储区 使用load指令将数据加载到此
存储内容(30bit)
标志位(2bit)
锁状态
对象哈希码(25bit) 分代年龄(4bit) 偏向模式(1bit) --0未偏向
01
未锁定
调用栈中锁记录的指针(30bit)
00
轻量级锁
重量级锁的指针(30bit)
10
重量级锁
空
11
GC标记
可偏向
类加载器的引用
To Survivors1(1/10)
HelloWorld.java
语义分析
与虚拟机非常相似 区别在于本地方法栈为虚拟机的Native方法服务 Hotspot将JVM栈和本地方法栈合二为一
字段信息
Serial Old(串整理)
局部变量表
根可达算法
动态链接
解析
标记清除法
词法分析
大对象(可设置)会直接进入老年代,年龄达到15或者Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,大于等于改年龄的所有对象直接进入老年代
类装载子系统
验证
本地方库
类元信息
方法信息
标记整理法
对齐填充-8字节倍数
TLAB(线程私有)
加载
1 JVM 使用一组OopMap的数据结构来表姐对象的引用位置,在类加载完成的时候,JVM就会把镀锡在什么偏移量上市什么类型的数据计算出来,这样就可以快速且准确 的完成GC Roots枚举2 如果未每一条指令都生成对应的OopMap 那将会需要大量的额外存储空间,所以只需要在特定的安全点添加存储空间 所以具有指令序列复用 的指令才会生成Safepoint 如方法调用 U型你换跳转 异常跳转 安全点暂停方式:抢占式 主动式中断。3 如果程序sleep或者blocketed 就不会走到安全点 这时需要引用安全区域
1 获取类的二进制字节流2 将静态结构转化为方法区运行时数据结构3内存中生成类对象 作为数据入口
类型指针
语法分析
记录出站地址既方法返回地址或异常地址
使用
对象头
初始化
垃圾回收算法--分代
字节码生成器
Class对象(类元信息,属性,方法,静态方法)
对象
Serial(并整理)
栈帧(sum)
运行时数据区
标记复制法
本地方法栈
准备
符号引用:1 类和结构的全限定名 2 字段名称和描述符 3 方法名称和描述符
JVM(Stack)
程序计数器
注释抽象语法树
卸载
新生代(1/3)--MinorGC
Class实例引用
G1(并发)整理+复制
Parlell Serial(并复制)
收藏
收藏
0 条评论
下一页