JVM
2023-01-26 17:09:56 0 举报
JVM 内存结构 垃圾回收
作者其他创作
大纲/内容
标记压缩算法
可回收
存活
未使用
S0
2
1
Eden
S1
ReMark
Concurrent Mark/Preclean
CPU2
CPU4
CPU3
Initial Mark
老年代、标记-压缩算法、STW
CMS
CPU1
新生代、复制算法、STW
SafePoint
空闲列表
已使用
Frame(栈帧)
……
Thread2
指针碰撞
空闲
指针
4. 设置对象的对象头
3. 初始化分配的空间
分配方式
执行
Run-Time Data Area(运行时数据区)
Run-Time Constant Pool(运行时常量池)
创建对象的方式:new关键字、类的newInstance、构造器的newInstance、clone、反序列化
直接内存
Concurrent Sweep
创建对象的步骤
类元信息、方法元信息等
2. 为对象分配内存
1.判断对象对应的类是否被加载、链接、初始化
Native Method Stacks(本地方法栈)
Method Area(方法区)
pc register for thread2
The pc Register(PC寄存器)
pc register for thread1
Initializing(初始化)
u2
字节码文件(.class)
cp_info
Loading(加载)
Lingking(链接)
Class Loader Subsystem(类加载子系统)
Java Virtua Machine Stacks(Java虚拟机栈)
Heap(堆)
Native Method Interface(本地方法接口)(JNI)
方法计数器
Native Method Library(本地方法库)
字段表集合
JIT Compiler(即时编译器)
属性计数器
garbage collector(垃圾回收器)
方法表集合
Execution Engine(执行引擎)
Interpreter(解释器)
属性表集合
u4
数据类型
字段计数器
接口索引集合
线程独享
interfaces_count
Stack Frame(栈帧)
fields_count
线程共享
constant_pool_count-1
Dynamic Linking(动态链接)
静态变量
字符串常量池
attribute_info
运行时常量池
堆
数量
元空间(本地内存)
类型信息、域信息、方法信息
Return Address(返回地址)
JDK1.8
field_info
Local Variables(局部变量)
Operand Stacks(操作数栈)
method_info
JIT代码缓存
access_flags
Heap(堆)
constant_pool
this_class
类文件结构
老年代:
名称
Old
To Survivor
minor_version
新生代:
magic
constant_pool_count
From Survivor
major_version
方法区(概念)
16
老年代
-XX:+PrintFlagsInitial:查看所有参数的默认值-XX:+PrintFlagsFinal:查看所有参数的最终值打印GC的简要信息:-verbose:gc-XX:+PrintGC打印GC的详细信息:-XX:+PrintGCDetails
8
1:2
参数配置:-Xms:堆初始值-Xmx:堆最大值-XX:NewRatio:老年代/新生代的比例-XX:NewSize:新生代初始值-Xmn:新生代最大值-XX:SurvivorRatio:新生代中1个Eden区与1个Survivor区的大小比值-XX:MaxTenuringThreshold:设置新生代垃圾的最大年龄
15
接口计数器
次版本号
魔数
常量池计数器
MinorGC(YoungGC)
主版本号
访问标志
常量池
父类索引
类索引
Native (本地内存)
Run-Time Data Area(运行时数据区)
描述
Java Virtual Machine Stacks(Java虚拟机栈)
Thread1
attributes
super_class
interfaces
methods_count
fields
attributes_count
methods
解释器
解释执行
抽象语法树
指令流(可选)
词法分析
程序源代码
语法分析
单词流
用户线程1
Serial Old回收器
Serial回收器
用户线程3
用户线程4
垃圾回收器
用户线程2
ParNew/SerialOld
GC线程
ParNew回收器
向上委托
目标代码
优化器(可选)
中间代码(可选)
生成器
保留区域
………………
3
5
4
CONSTANT_String_info
CONSTANT_Class_info
CONSTANT_Methodref_info
CONSTANT_Fieldref_info
常量池项目类型
CONSTANT_Integer_info
CONSTANT_Utf8_info
CONSTANT_Long_info
CONSTANT_Float_info
CONSTANT_Double_info
…………
Loading加载
Class文件
双精度浮点型字面量
长整形字面量
字符串类型字面量
类或接口的符号引用
类中方法的符号引用
字段的符号引用
…
整型字面量
Utf8编码字符串
浮点型字面量
6
7
10
9
编译执行过程
对象类型数据
方法区
指向对象类型数据的指针
复制算法
long
reference
对象实例数据
指针直接访问
JVM虚拟机栈局部变量表
short
int
标记-清除算法
App ClassLoader应用类加载器(系统类加载器)
Extension ClassLoader扩展类加载器
上层类加载器加载失败交由下层类加载器加载
用户自定义类加载器
自顶向下尝试加载类
类加载器的分类
自底向上检查类是否加载
Bootstrap ClassLoader启动类加载器
虚拟机会检查符号引用的类或者方法是否存在,当前类是否有权限访问。
0.0d
double
零值
(byte)0
byte
0.0f
float
(short)0
Linking连接
GC
Initializing初始化
Preparation准备
Verification验证
给类变量(成员静态属性)分配内存,并赋初值(零值)。
Resolution解析
格式验证
语义验证
魔数、版本、
字节码验证
比如:是否有父类(除了Object),非抽象类中方法是否都实现了等等。
符号引用验证
它试图对字节码流进行分析,并验证。比如跳转指令能否指向正确的位置;函数调用是否传递了正确的参数;变量赋值是否给了正确的数据类型等等。
0L
boolean
′\\u0000′
false
0
null
char
轻量级锁、自旋锁、无锁
2bit锁标志位
0 0
指向线程栈中Lock Record的指针
指向互斥量(重量级锁)的指针
重量级锁
GC标记信息
1 0
62bit
锁状态
偏向锁
epoch
当前线程指针
分代年龄
unused
0 1
1bit偏向锁位
4bit
1bit
指向对象实例数据的指针
实例池
句柄池
句柄访问
CMS过程中用到的标记信息
对象访问定位:句柄访问直接指针访问
1 1
Padding
Instance Data
对象头
实例数据
对象布局
Class Pointer
Mark Word
Length(数组对象才有)
2bit
54bit
无锁态(new)
hashcode(若调用)
31bit
25bit
填充
以64位系统为例,MarkWord占8个字节。
0 条评论
下一页