JVM_草稿图
2024-09-03 10:42:43 4 举报
JVM_草稿图描述了Java虚拟机(JVM)的核心架构和工作原理。 JVM是一种用于执行Java程序的软件,它负责将Java字节码转换成机器码,并在计算机上运行。 图中展示了JVM的主要组件,包括类加载器(Class Loader)、执行引擎(Execution Engine)和运行时数据区(Runtime Data Area)。 类加载器负责加载和链接Java类,执行引擎负责执行Java字节码,运行时数据区则存储了线程、堆、方法区和常量池等运行时数据。 此外,图中还展示了JVM与操作系统和硬件之间的交互,以及Java程序与JVM之间的通信方式。
作者其他创作
大纲/内容
pc(5): dup
class content
SafePoint
0x7ffeee
筛选回收
用户线程2
通过句柄访问对象
\"11\"
卡表
Server Compiler
...java.lang.String
s1
he
H
-------
add方法对象
用户线程3
到对象实例的指针
到对象类型数据的指针
D
C
是否存在已编译版本
参数1(args)的值(对象的地址)
access flags类的访问控制权限
CLASS
对象头区域Header
栈
BootstrapMethod(#0)
类型指针基于哪个类生成的对象
8G
oop模型
Memory Cell
用户线程4
CONSTANT_Double_info
引用
新生代(1/3)Young
HashTableEntry
GC线程4
指向所属类
llo
编译javac
bytes[length]length个字节
value
Mark Word
Client Compiler
...java.lang.PrintStream...
Metadata
操作数栈
空值检查消除
范围检查消除
其他优化...
F
CPU0
1
!
char[]
运行时数据区
20
....
new创建的字符串对象
typeArrayOopDesc\"11\"
u2
typeArrayOopDesc
Object F
本地方法栈Native Method
对齐填充Padding
A
...java.lang.Object
解释器
逆优化
ClassLoader
3
MarkOopDesc存放锁信息、分代年龄....
CPU2
常量池
已经加载
堆
第二阶段
GC线程1
用户线程1
指向该属性名或方法名在常量池中的索引项
正常
\"1\"
Finalizable
Parallel Old
ParallelScavenge
oopDesc
存活对象
指向UTF-8编码的字符串在常量池中的索引
Class<...>
Heap
局部变量数组
0x7ffddd
分配的内存16B
字节码文件组成
虚拟机栈
GC完成用户线程恢复
挂载
Serial - GC线程
String[]
自定义加载器加载管理区? extends ClassLoader
后端
实例数据区域
JDK1.6
数据区
未使用
AppClassLoader
锁状态
56bit
1bit
4bit
2bit
unused
分代年龄
是否偏向锁
锁标志位
无锁状态
unused:25bit
hashCode:31bit
0
01
偏向锁
线程ID:54bit
Epoch:2bit
轻量级锁
指向栈中所记录的指针(ptr_to_lock_record)
00
重量级锁
指向互斥锁(重量级)的指针(ptr_to_heavyweight_monitor)
10
GC标记
空
11
运行执行引擎
表示方法访问权限及属性的各标志
本地代码
E
S
O
64位JVM的对象MarkWord组成
局部变量表
s2
s4=\"11\"
Application.java
cell
某个ClassLoader
tag=61个字节
0x7ffggg
ExtClassLoader
test324B
已用块
ParNew/Serial Old收集器运行示意图
CONSTANT_Float_info
代码
16
fields_count属性数量
Pause Mark End
interfaces_count实现的接口个数
自定义路径加载
对齐填充区域
Medium32MB
CONSTANT_String_info
Concurrent Prepare for Reloc
minor version次版本号
Serial Old(MSC)
寄存器分配
窥孔优化
机器码生成
连接 > 初始化类加载子系统
arrayOopDessc数组对象
NUMA
数组长度
成员属性
Object I
老年代(2/3)Old
MethodHandleInfo(#23)
委托
Memory
委托父类
Stack
加载我们自己指定的目录中的class
typeArrayOopDesc基本数据类型数组
编译编译器
To区(1/10)S1区
操作系统和本地资源
s2引用
模板解释器
Java进程
对象B
Test.java
CMS
2
域C(权限组Z)
注意:没有tag=2的项
pc(1): istore_1
域B(权限组Y)
对象类型数据
附加信息
并发清理
CONSTANT_Fieldref_info
G1 收集器运行示意图
程序计数器Program Counter Register
指向类的全限定名在常量池中的索引
委托方向
返回地址 恢复现场
public static void test1() { String s1 = new String(\"11\"); String s2 = new String(\"11\");}
字符串常量池
扩展类加载器ExtensionClassLoader
Java Heap
MethodTypeInfo(#24)
I
Region2M
major version主版本号
MetasapceObj
暂停所有用户线程只跑GC线程,且GC是单线程
回收前状态
s4引用
暂停所有用户线程只跑单线程GC老年代GC时间比较长
12
13
14
15
17
bottom
Pause Mark Start
栈帧
启动类加载器BootstrapClassLoader
访问权限
Marked 0
Java栈本地变量表
int
short
reference
double
......
对象实例数据
类属性
OS Heap
生成对象的地址
Small2MB
CPU 1
Concurrent Renao
interfaces[]实现的接口
0xC4WIDE
0x84IINC
0x00slot index
0x00Slot index
0x01step
270M
String Pool
优化后的HIR
JDK1.7代码图代码二
constant pool常量池
loadClass委派模型逻辑
OopMapSet
实例数据Instance Data
新生代
从classpath加载
卡页1512字节
执行引擎执行globalVariableEscape
以解释方式执行方法
InstanceKlass
最终标记
object
已用内存
7
动态链接 直接地址
业务逻辑代码
s1引用
第一阶段
K
CONSTANT_Methodref_info
Perm Space
JVM中的用户线程
InstanceRefKlass描述java.lang.ref.Reference的子类
G
S2
InstanceMirrorKlass描述java.lang.Class的实例
CLASS_PATH指定目录的所有jar
即时编译
BootstrapClassLoader
操作数栈共享区域
其他栈帧信息
CPU3
top
s3.intern()
Concurrent Relocate
类加载的过程
Interpreter
JVM
新增
index2个字节
Serial/Serial Old收集器运行示意图
单个对象内存布局
加载
新生代采用复制算法,暂停所有用户线程
main方法对象
intern()方法调用
对象A
不可回收的对象
GC线程2
magic魔数
重新标记
method_info[]方法值
方法内联
常量传播
class 对象
恢复现场:1.如果方法有返回值,需要将返回值压入调用者的操作数栈中2.回收调用结束的方法的栈帧占用的空间3.重置局部变量表指针、操作数栈指针4.重置程序计数器
Stringobj
G1
4 invokespecial #1 <java/lang/Object.<init>>
loadClass类查找、字节码读取
Test完整对象
Object B
HIR(SSA形式)
QQ
InstanceOopDesc非数组对象
String
public void globalVariableEscape() { globalVariableObject = new Object()}
black table
引导加载器加载管理区BootstrapClassLoader
成员方法
public static void test1() { String s1 = \"11\";}
Java方法返回
.java
CPU 0
200M * 3
2.7G
end
CONSTANT_NameAndType_info
bytes[4]4个字节
第二次分配
方法区Method Area
宽指令
Object D
加载类的顺序
初始标记
Test.class
CustomerClassLoader
55 48 89 e5 b8 0b 00 00 00 5d c3
Pause Relocate Start
Object C
虚拟机栈VM Stack
回收后状态
Cat.java
通过直接指针访问对象
InstanceClassLoaderKlass
Serial Old -GC线程
NameAndTypeInfo(#26)
两计数器值之和是否超过阈值
CPU1
tag=11个字节
CompressedWriteStream 可扩张
3 dup
数组对象内存布局
pc(6): invokespecial #1
LTR
方法区
tag=51个字节
public static void test1() { String s1 = new String(\"11\");}
tag=31个字节
Eden区(8/10)
64-bit Object Pointer
使用Using
10 return
hello
局部表开始指针
自定义类加载器UserClassLoader
字节码
5.4G
gray table
s3引用
HIR到LLR转换
From区(1/10)S0区
48
从/jre/lib中加载
CONSTANT_Interface_Methodref_info
ClassFile
JVM的沙箱机制跟Linux的权限机制有点像
高地址
解析Resolution
加载Loading
s.intern()
堆Heap
CONSTANT_Class_info
否
method_count方法数量
constant pool count常量池大小
扩展类加载器加载管理区ExtClassLoader
...java.lang.System
低尾端(小端)
arr
两个栈帧之间的数据共享
加载类加载器子系统
Concurrent Mark
Memory Pool
B
public static void test1() { String s1 = \"11\"; String s2 = \"11\";}
ArrayKlass
TypeArrayKlass描述java中基本类型数组的数据结构
操作数栈当前指针
用户线程
Classloader两个重要方法逻辑关系
可以回收的对象
系统域
new top
OopMap
FieldType中的字符
类型
含义
byte
有符号的字节型数
char
基本多文种平面中的Unicode字符码点,UTF-16编码
双精度浮点数
float
单精度浮点数
整型数
J
long
长整数
L ClassName;
ClassName类的实例
有符号短整数
Z
boolean
布尔值true/false
[
一个一维数组
Java方法入口
BootstrapMethods
第三阶段
可用内存
main方法
Young generation
Java堆
ParNew
实例池
CPU 2
\"11\"引用,等于s3
CONSTANT_Integer_info
第四阶段
方法调用计数器值加1
执行编译后的本地代码版本
Klass模型类的继承结构
操作系统内存
Method AreaPerm Space
Object A
this_class类名
MethodInfo(#29)
局部变量表共享区域
对象
objArrayOopDesc引用类似数组
GC线程
并发标记
Memory Chunk
是
重置线程
case(NEW) {.......}
域A(权限组X)
GC线程3
pc(0): iconst_1
准备Preparation
浏览器
老年代采用\"标记-整理\"算法,暂停所有用户线程
线程1
堆(Heap)
field_info[]属性值
InvokeDynamicInfo(#2)
Klass
Extension加载失败
.....
低地址
高尾端(大端)
512个,每个1B
编译器
attributes_count类属性数量
BootStrap加载失败
句柄池
断开
标志名
值
ACC_PUBLIC
0x0001
声明为public,可以从包外访问
ACC_FINAL
0x0010
ACC_SUPER
0x0020
当用到invokespecial指令时,需要堆父类方法做特殊处理
ACC_INTERFACE
0x0200
该class文件定义的是接口而不是类
ACC_ABSTRACT
0x0400
声明为abstract,不能被实例化
ACC_SYNTHETIC
0x1000
声明为synthetic,表示该class文件并非由java源代码所生成
ACC_ANNOTATION
0x2000
标识注解类型
ACC_ENUM
0x4000
标识枚举类型
可回收
Marked 1
JDK1.7
E(Eden)
S(Survivor)
O(Old)
H(Humongous)
数据类型
零值
0L
(short)0
'\\u0000'
(byte)0
false
0.0f
0.0d
null
add方法
方法区(Method Area)
执行引擎
22
33
44
class文件
jre/lib/rt.jar
bytes[8]8个字节
length2个字节
JDK version
major
minor
1.0
1.1
45
1.2
46
1.3
47
1.4
1.5
49
1.6
50
1.7
51
1.8
52
Remapped
ObjB
ZGC Heap Regions
空闲块
字面量创建的字符串池对象
JDK1.7代码图
卸载Unloading
Concurrent Mark Sweep 收集器运行示意图
klass对象
第一次分配
方法对象集合
说明
ACC_PRIVATE
0x0002
ACC_PROTECTED
0x0004
声明为protected,子类可以访问
ACC_STATIC
0x0008
声明为static
ACC_SYNCHRONIZED
ACC_BRIGE
0x0040
声明为brigdge方法,由编译器产生
ACC_VARARGS
0x0080
表示方法带有变长参数
ACC_NATIVE
0x0100
声明为native,该方法不是用Java语言实现的
ACC_STRICT
0x0800
声明为strictfp,使用FP-strict浮点模式
ACC_SYNCTHETIC
该方法是由编译器合成的,而不是由源代码编译出来的
指向该属性或方法描述符在常量池中的索引项
从/jre/lib/ext中加载
UMA
ObjArrayKlass描述java中引用类型数组的数据结构
字节码文件
LargeN x 2MB
应用类加载器加载管理区AppClassLoader
重叠区域
Animal.java
pc(2): new
GC Roots Object
Tenured generation
Unused(18 bits)
jre/lib/ext/*.jar
MethodHandleInfo(#25)
字节码解释器
代码段
查找class对象
11 22 33 44
0 new #2<java/lang/Object>
u4
解释器与编译器的交互
pc(10): return
test232B
pc(9): astore_2
前端
应用程序类加载器ApplicationClassLoader
类访问和属性修饰符标志
super_class父类名
2.2G
indy
7 putstatic #3 <com/cover/runengine....>
Attributes
不同语言能在JVM上运行的本质
解析成InstanceKlass
验证Verification
.kt
接口
堆、堆外内存、直接内存
attributes[]方法值
连接(Linking)
初始化Initialization
微信
test16B
基本数据类型的零值
!
Parallel Scavenge/Parallel Old 收集器运行示意图
CONSTANT_Long_info
JDK1.6代码图
...java.lang.Class
卡页
Serial
向编译器提交编译请求
tag=41个字节
类加载子系统
CONSTANT_UTF8_info
第五阶段
ObjA
源文件文件
字段描述符解释表
0 条评论
下一页