Java虚拟机_草稿图
2025-05-20 17:18:06 2 举报
在本次草稿图中,我们展示了Java虚拟机(JVM)的核心组件,以便开发者更好地理解其内部工作原理。该草稿图详细描绘了JVM的三个主要组成部分:类加载器子系统、运行时数据区、以及执行引擎。 文件类型: 这份草稿图是以矢量图形格式创建的,以确保无论放大或缩小,图像的质量都能保持不变。矢量图在需要高分辨率图形时,尤其是在技术手册或演示文稿中,是非常理想的文件类型。 修饰语: 这张草稿图是“详细”和“结构化”的。它“清晰地”展示了JVM的关键组成部分,并通过颜色编码和标签“直观地”标注了不同的功能区域。此外,草稿图中还包括了有助于理解各组件间关系的“注释和说明”,使其不仅限于视觉呈现,而且还是一个功能强大的学习和教学工具。 核心内容: 在类加载器子系统部分,草稿图阐释了Java程序的类文件是如何被加载、链接和初始化的过程。运行时数据区详细展示了包括堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(Program Counter)和本地方法栈(Native Method Stack)在内的不同内存区域。最后,执行引擎部分向读者展示了如何解释字节码或将其转译成本地机器代码,从而在Java虚拟机上运行程序。 综合以上元素,该草稿图为学习和开发Java程序的技术人员提供了宝贵的学习资源。
作者其他创作
大纲/内容
virtual_func1
virtual_func2
...
virtual_funcn
Java字节码中常量池的组成结构
将3移动到这里24(%esp)
偏移量
字节码指令
0
iconst_3
1
istore_0
2
bipsuh 81
4
istore_1
5
iload_0
6
iload_1
7
iadd
8
bipush 9
A
isub
B
istore_2
C
return
CallStub堆栈
arg1
arg n
local 1
local n
return address
bp
frame1
frame2
frame3
没有gap机制时的Father类实例内存布局
堆栈变量1
堆栈变量2
堆栈变量3
入参n
入参...
入参2
入参1
eip
ebp
未进行字段重排时类A的内存布局
4字节
解析魔数
解析版本号
解析常量池
解析父类
解析接口
解析类变量
解析类方法
构建类结构
类型
名称
数量
u2
attribute_name_index
u4
attribute_length
constantvalue_index
add()方法的局部变量初始化时的内存布局及edi寄存器指向位置
methodOop
main()函数堆栈布局
数据区
开发
不同的平台上,分别开发不同的代码,例如访问线程、读写文件、申请内存等,不同平台不同操作系统提供的API一定是不同的,因此所谓用的接口也不尽相同(Windows上创建线程CreateThread函数,Linux上则是pthread_create函数)
编译
得在不同的平台上,安装不同的编译器,然后才能执行不同的编译命令编译程序(例如Windows上需要各种dll动态链接库,Linux上需要各种so动态链接库支持)
打包
在不同的平台上,需要选择适应该平台的软件包和编译器,对程序进行打包
运行
不同的平台上,需要有不同的安装环境,例如Windows上需要各种
对象头
2字节
maxLocals - sizeOfParameters20字节
Java函数入参
20字节
method
局部变量区
Java栈帧结构体
main()函数栈底ebp
main()方法栈,8字节
字段域
%edi
JVM主函数
程序计数器
_mark
_metadata
实例数据
Dog的vtable结构
CallStub()栈顶
constantPoolOop自己的字段
instanceOop
16%ebp
Animal和Dog类的vtable结构
入参
位置
(address)&link: 连接器
2N(%ebp)
result_val_address: 返回地址
3N(%ebp)
result_type: 返回类型
4N(%ebp)
method(): Java方法的内部对象
5N(%ebp)
entry_point: Java 方法调用入口例程
6N(%ebp)
args->parameters(): Java方法的入参
7N(%ebp)
args->size_of_parameters(): Java方法的入参数量
8N(%ebp)
CHECK: 当前线程
9N(%ebp)
继承自oopDesc
Java函数参数第三轮压栈
i1
i2
补白
psPermGen
操作数栈
固定帧
局部变量表
操作数栈重叠区域
methods结构组成
内存高地址
father
constantPoolKlass内存布局模型
java.cInitializeJVM()
local1
local2
arg2
arg3
char c
padding
long l
long plong
JVM内存区
栈顶
CallStub例程中call %eax的下一条指令地址
int a
字节码指针
byte b2
Java类字段的起始偏移量
16字节
caller方法栈
8(%ebp)
access_flags的可选项
入参区域
esp
Java字节码
main()函数栈底
add()函数栈底,当前ebp指向这里
length个指针宽度
36(%ebp)
1字节
7字节
8字节
3字节
内存低地址
加载
JDK8的method对象内存布局图
参数
保存位置
link
仍在堆栈中8(%ebp)
result_val_address
仍在堆栈中12(%ebp)
result_type
仍在堆栈中16(%ebp)
被传送到ebx寄存器中,原本在堆栈中20(%ebp)
entry_point
被传送到eax寄存器中,原本在堆栈中24(%ebp)
parameters
被传送到edx寄存器中,原本在堆栈中28(%ebp)
size_of_parameters
被传送到ecx寄存器中,原本在堆栈中32(%ebp)
CHECK
仍在堆栈中36(%ebp)
C++类标记
(address)&link
method()
args->parameters()
args->size_of_parameters()
入参3
0x0
public claass A { private Integer age; private String name; private Boolean sex;}
成功
-0x4(ebp)
int i
short s
short s2
byte b
call_helper()函数栈基%ebp所指
c
s
methodOop自己的字段
klass
表达式栈
3
虚函数表
字段x
设置偏向锁
实例数据1
实例数据2
实例数据n
fingerprint
max_locals
bytecodes
b1
b2
b3
b4
post_allocation_setup_no_klass_install
main()函数初始堆栈布局
清零
类解析地图
son的内存空间
28(%ebp)
16(%esp)
InterpreterMacroAssembler
说明
start_pc
字节码行号
line_number
Java源码行号
c++ vtbl pointer
_layout_helper
_java_mirror
_name
_methods
_fields
_class_loader
_inner_classes
_nonstatic_field_szie
_static_field_size
_idnum_allocated_count
vtable
itable
static fields
oopmap
_call_stub_entry 例程
oop对象头
调用entry_point
12%ebp
-0xc%ebp
类解析的步骤
methodKlass
kalss体系所对应的handle体系
1.为klassOop申请内存
执行iadd指令之后的堆栈布局
main()函数栈顶esp
local_variable_info类型的数据结构
75
// ...
thread
parameterSize
resultAddress
edi
esi
ebx
mxcsr
arg 1
allocate_permanent()
12(%ebp)
4(%esp)
4字节+16字节
frame memory
Java函数局部变量
执行iconst_3指令之后的堆栈布局
20(%esp)
JVM堆内存
allocate_permanent
EDEN区分配
执行完post_new_init_klass()函数之后的klassOop内存布局
类元信息
28(%esp)
thread1
classFileParser::parseClassFile()
32(%ebp)
constantPoolKlass
ClassFileParser::parseClassFile()
变量区
klassKlass
CallStub()栈基%ebp指向这里
代码段
Java方法的局部变量表覆盖范围
short c
局部变量压栈之前和之后的堆栈对比图
Java类的生命周期
存储该位置自己堆栈内存地址
new_constantPool()
custom class loade n
oop类型描述的对象
finalize()
equals()
toString()
hashCode()
clone()
void say()
Java类数据结构
edx: 14
81
-5(%ebp)
MyClass字段域
#1
8(%esp)
allocate()
TLAB开关打开
post_new_init_klass
Java类加载器之间的委派关系
offset=32
java stack
9大属性
常量池解析示意图
32位x86平台上的内存对齐规则
#0
函数n的栈顶
函数n的堆栈
函数2的堆栈
函数1的堆栈
函数1的栈底
obj_set_klass
javaCalls:call_helper()执行enter()前后sp和bp寄存器指向
local1=1
local2=2
local3=3
*pre
local1=5
local2=6
local3=7
lcoal1=8
local2=9
local3=10
// ..
argn
localn
returnaddress
caller sp
constantPoolCache
localspointer
bcp
预留空间
b5
allocate_noexpand()
TemplateInterpreterGenerator::generate_fixed_frame(bool native_call)
12(%esp)
调用Java函数
Test字段域
维度
Windows
Linux
可执行文件
.exe(PE格式)
无扩展名或.out(ELF格式)
动态库
.dll
.so
静态库
.lib
.a
Father类的堆内存布局
constantPoolOop的内存布局
2.klassOop内存清零
24(%esp)
main()函数栈顶
Test类所对应的instanceOop的内存布局(64位平台,开启指针压缩选项)
java.c: main()
完成add()参数复制后的main()函数堆栈布局
maxLocals- sizeOfParameters40字节
堆栈变量区
C程序的兼容性处理方式
占用内存
偏移
字段
_fingerprint
volatile unsigned __int64
_constants
CostantPool *
16
_stackmap_data
Array<unsigned char>*
24
_constMethod_size
int
28
_flags
unsigned short
30
_code_size
32
_name_index
34
_signature_index
36
_method_idnum
38
_max_stack
40
_max_locals
42
_size_of_parameters
add()方法栈,16字节
其他应用内存
*base
*top
size
maxSize
main()函数中的Test实例及Test类应用成员变量的内存布局
func2 stack
java类加载阶段所产生的结果
add()函数栈顶esp
class A
类
定位
instanceHandle
类实例handle
methodHandle
方法实例handle
constMethodHandle
方法字节码实例handle
methodDataHandle
性能统计handle
arrayHandle
数组handle
constantPoolHandle
常量池handle
constantPoolCacheHandle
常量池缓存handle
objArrayHandle
引用类型数组handle
typeArrayHandle
基本类型数组handle
JVM系统加载器的继承关系
constantPoolOop
Animal的vtable结构
数据段
-0x4%ebp
局部变量表地址
6字节
以bp为基址对变量进行标记
HotSpot在x86平台上的4层汇编器继承关系
longs
ints
shorts
bytes
oops
入参1的实际内存起始位置
permanent_obj_allocate_no_klass_install()
oop的模型
Klass
klass家族的基类
instanceKlass
虚拟机层面与Java类对等的数据结构
instanceMirrorKlass
描述Java.lang.Class的实例
表示Java类的方法
constMethodKlass
描述Java类方法所对应的字节码指令信息的固有属性
klass链路的末端。该类型在JDK8中已经不复存在,但是由于其比较重要,因此依然会介绍这个特殊的klass
arrayKlass
描述Java数组的信息,是个抽象基类
typeArrayKlass
描述Java中基本类型数组的数据结构
objArrayKlass
描述Java中引用类型的数据结构
constPoolKlass
描述Java字节码文件中的常量池的数据结构
constMethodOop
标志名称
标志值
含义
ACC_PUBLIC
0x0001
字段是否为public
ACC_PRIVATE
0x0002
字段是否为private
ACC_PROTECTED
0x0004
字段是否为protected
ACC_STATIC
0x0008
字段是否为static
ACC_FINAL
0x0010
字段是否为final
ACC_SYNCHRONIZED
0x0020
字段是否为synchronized
ACC_BRIDGE
0x0040
字段是否由编译器产生的桥接方法
ACC_VARAGS
0x0080
方法是否接受不定参数
ACC_NATIVE
0x0100
字段是否为native
ACC_ABSTRACT
0x0400
字段是否为abstract
ACC_STRICTFP
0x0800
字段是否为strictfp
ACC_SYNTHETIC
0x1000
字段是否为编译器自动产生
call_helper()局部变量
-0x10%ebp
oopDesc
constantPoolOop初始化tag之后的内存布局
函数分发表
36%ebp
offset=14
Y
psOldGen.hppobject_space()->allocate(word_size)
length个指针宽度的数据区
执行完\"push %rsi\"指令之后的堆栈空间布局图
字节码行号(也即字节码指令偏移位置)
-4(%ebp)
javaCalls::call_helper()与CallStub(0的堆栈布局
PC
permanent_mem_allocate()
寄存器名
指向
edx
parameters首地址
ecx
Java函数入参数量
指向Java函数,即Java函数所对应的method对象
CallStub栈顶
84
9
inner_class_info_index
outer_class_info_index
inner_name_index
inner_name_access_flags
bp位于局部变量表里面
heap
line_number_table_length
line_number_info
line_number_table
N
create_klass
属性结构
初始化局部变量表之后
instanceOop的内存布局
指向类结构内存位置
平台/编程语言
API数量
C编程语言
200多个
300多个
2000多个
END
offset=28
常量池元素结构
add()方法完成求和时的堆栈布局
main:rbp
constantPoolKlass内存布局
klassKlassOop的实例数据区
常量数量
常量池元素1
常量池元素2
常量池元素3
常量池元素n
LocalVariableTable属性表结构
allocate_permanet
instanceKlassHandle
类元结构handle
methodKlassHandle
方法元结构handle
constMethodKlassHandle
方法固定类元结构handle
klassKlassHandle
klass链路末端类handle
arrayKlassKlassHandle
描述基类数组元结构handle
objArrayKlassKlassHandle
描述引用类型数组的类元结构handle
typeArrayKlassKlassHandle
描述基本类型数组的类元结构handle
arrayKlassHandle
基类数组元结构handle
typeArrayKlassHandle
基本类型数组的类元结构handle
objArrayKlassHandle
引用类型数组的类元结构handle
constantPoolKlassHandle
常量池类元结构handle
constantPoolCacheKlassHandle
常量池缓存类元结构handle
40字节constantPoolOop基本信息
main()方法栈帧
调用函数
是否为public类型
ACC_SUPER
是否允许使用invokespecial字节码指令,JDK1.2以后编译出来的类这个标志为真
ACC_INTERFACE
0x0200
标识这是一个接口
是否为abstract类型,对于接口和抽象类,此标志为真,其他类为假
标识这个类并非由用户代码产生
ACC_ANNOTATION
0x2000
标识这是一个注解
ACC_ENUM
0x4000
标识这是一个枚举
Java栈帧的详细结构
Java类结构存储区
local_variable_table_length
local_variable_info
local_variable_table
Bit分布
内容
0-1
锁状态标志位
2-3
GC状态(分代年龄)
4-57
哈希码(可能存放线程ID或锁指针)
58-63
其他信息
Java函数入参内存
func2
offset=12
caller.bp
Integer-instanceOop
Java方法执行完成之后,回收的堆栈空间涵盖范围
解析方法常量池元素后的内存布局
java_md.c: LoadJavaVM()
使用gap机制时的Father类实例内存布局
tempalteInterpreter.cpp: initialize()
main()函数调用add()函数时的整体堆栈布局
局部变量的生命周期开始的字节码偏移量
length
局部变量作用范围覆盖的长度
name_index
指向常量池中CONSTANT_Utf8_info类型常量的索引,局部变量名称
descriptor_index
指向常量池中CONSTANT_Utf8_info类型常量的索引,局部变量描述符
index
_handle
func1 stack
函数堆栈空间布局通用模型
char b
这里仅仅是一个数值,不指向任何地方
Code属性结构表
4(%esp) 或者-12(%ebp)
将return address弹出之后的堆栈内存布局
main()函数调用add()函数时所压栈的入参位置
JVM解析Java字节码文件的总体步骤
分配常量池内存
enter()执行后
klassKlass实例构建的总体链路
8%ebp
解析常量池信息
CallStub例程中call *%eax的下一条指令
AbstractAssembler
collectedHeap.inline.hppUniverse::heap()->permanent_mem_allocate(size)
handle
Java最后一个入参在堆栈中的位置
28%ebp
回收的堆栈空间
32字节
base_create_klass_oop
24%ebp
JVM代码段
Java函数参数第二轮压栈
frame4
_tags
_cache
_pool_holder
_operands
_length
_is_conc_safe
_orig_length
......
call_helpe()局部变量
parameter_size变量实际所代表的堆栈位置
sun.misc.AppClassLoader
klassKlass内存布局模型
局部变量
CallStub执行完call *%eax指令后的内存布局
JVM例程的起始位置
oopDesc的_metadata指向
变量类型
长度
对齐规则
char
按1字节对齐
short
按2字节对齐
按4字节对齐
32%ebp
执行isub指令之后的堆栈布局
线程m堆栈
物理机器总内存
JDK6的methodOopDesc内部布局
大端
调用函数操作数栈
12(%esp) 或者-4(%ebp)
压栈
32 byte
klass家族成员
10
klassOop
klassKlass实例区
init.cpp::init_globals()调用interpreter_init()
JVM堆
ecx: 6
MarkWord的结构(64位模式下)
constantPoolKlass实例构建时序图
执行iload_1指令之后的堆栈布局
Java类的两模型三维度
memory
InnerClasses属性结构表
返回oop
操作系统内存区
标识字符
基本类型byte
基本类型char
D
基本类型double
F
基本类型float
I
基本类型int
J
基本类型long
S
基本类型short
Z
基本类型boolean
V
特殊类型void
L
初始化klass
栈顶指针
obj->set_klass
klassOop实例化的6个步骤
14
rip
rbp
被调用函数局部变量表
add()函数栈底ebp
char b
templateTable.cpp::TemplateTable::initialzie()初始化模板表
CallStub执行完 call *%eax指令后的内存布局图
类解析的当前步骤——类方法解析
第一个例程
constantPoolOop实例构建过程中设置_metadata
....
8 (%esp)
args: slot=0
a: slot =1
b: slot = 2
sum : slot = 3
locals pointer
栈底指针
jvm堆栈
args
test
max_stack
code_length
u1
code
exception_table_length
exception_info
exception_table
attributes_count
attribute_info
attributes
LineNumberTable属性结构表
field1
field2
fieldn
执行完add()函数时的整体堆栈布局
字段名
含义/作用
对象布局的综合描述符
类名。例如,java.lang.String类的_name属性值会是java/lang/String
类的镜像类
_super
父类
_subklass
_next_sibling
指向下一个兄弟节点,若无,则为NULL
_modifier_flags
修饰符表示,例如static
_access_flags
访问权限标识,例如public
post_allocation_setup_no_klass_install()
ClassFileParser::parse_constant_pool()
软件实现的堆栈,堆栈底部和顶部指针
常量池内存分配调用链路
对象头:继承自oopDesc
oop
所有oop的顶级父类
表示Java类实例
表示Java方法
表示Java方法中的只读信息(其实就是字节码指令)
methodDataOop
表示性能统计的相关数据
arrayOop
数组对象
objArrayOop
表示引用类型数组对象
typeArrayOop
表示基本类型数组对象
表示Java字节码文件中的常量池
constantPoolCacheOop
与constantPoolOOp相伴生,是后者的缓存对象
指向JVM内部的klass实例的对象
markOop
oop的标记对象
oopFactory
main()函数完成add()调用之后的堆栈布局
-0x8%ebp
java.lang.ClassLoader
caller方法栈,8字节
value=3
(%esp)
Line_number_info属性结构表
fields结构组成
CallStub()函数栈底,当前ebp指向这里
oopFactory::new_constantPool()
返回klassOop
堆栈底部栈帧
number_of_classes
inner_classes_info
inner_classes
对CallStub()的8个入参的ebp偏移位置按4字节为单位进行标记(注:表中的N=4)
父类域
子类域
call_helper()函数栈顶%esp所指
init.cinit_globals()
完成add()调用后的main()函数堆栈布局
fixed frame
expressionstack
24(%ebp)
student1
student2
student3
执行istore_1指令之后的堆栈布局
esp指向
klass类相关字段
4字节+16
offset=16
stubGenerator_x86_64.cppgenerate_initial()
程序被操作系统加载后的内存映像
common_permanent_mem_allocate_init
线性顺序分配的堆栈布局
fingerprint 1
fingerprint 2
method_idnum
generic_signature_index
byte codes
linenumbertable
localvariabletable
checked exceptions elements
(%ebp)
// ....
Test.main()函数执行完iload_1字节码指令之后的栈帧结构
sp
执行完\"push %ebp\"和\
jdk1.8 x64的执行链路
JVM堆栈
struct B
ClassFileParser::parse_constant_pool_entries()
local1=11
local2=12
local3=13
Universe::Heap()
4%ebp
struct A的内存布局
extension class loader
Test.main()函数第一条字节码指令执行之前的栈帧结构
constantPoolKlass实例区
堆
20%ebp
call_helper()函数栈底
markOopDesc实例
将5移动到这里20(%esp)
Java数据类型与JVM5种数据类型的对应关系
access_flags可选项值
permanent_obj_allocate()
eax: 14
_orig_length:0
_cache:null
_pool_holder:null
_operands:null
_flags:0
_length:length
_is_conc_safe:true
_tags:null
son的内存空间布局
constMethodOop内存布局
funcN stack
SourceFile属性结构表
4.初始化klassOop._metadata
调用CallStub
thread4
byte code pointer
methodOop对象的内存布局
每一个常量池元素都由两部分组成:tag和数据内容
bootstrap class loader
栈帧重叠示意图
慢分配流程
执行istore_0指令之后的堆栈布局
Java函数参数第一轮压栈
thread3
Test-instanceOop
准备
system class loader
call_helper()函数栈基 %ebp所指
一种假设的内存布局图
a = 18
b = 21
sum
a=18
属性名称
使用位置
Code
方法表
Java代码编译成的字节码指令
ConstantValue
字段表
final关键字定义的常量值
Deprecated
类文件、字段表、方法表
被声明为deprecated的方法和字段
Exceptions
方法抛出的异常
InnerClasses
类文件
内部类列表
LineNumberTable
Code属性
Java源码的行号与字节码指令的对应关系
LocalVariabletable
方法的局部变量描述
SourceFile
源文件名称
Synthetic
类文件、方法表、字段表
标识方法或字段是由编译器自动生成的
tag标识
元素内容
继承于父类的字段域
MacroAssembler
custom class loader 1
Java方法堆栈
START
CallStub()栈基 %ebp指向这里
40 byte constantPoolOop基本信息
寄存器保存区
common_permanent_mem_allocate_init()
Java源代码
ConstantValue属性结构表
main()与add()函数堆栈整体布局
5.初始化klass
专有属性区
oop、klass、handle的三角关系
//...
JVM数据段
add()函数栈顶,当前esp指向这里
add: rsp
constMethod
method_size
intrinsic_id
CallStub()入参
类元
20(%ebp)
main()函数压参后的堆栈整体布局
local3
permanent_obj_allocate_no_klass_install
常量池解析、字段解析、方法解析,在perm/meta区域构建模板
kl->as_klassOop
32字节
初始堆栈布局
main方法栈,32字节
C语言所模拟的线性顺序分配的堆栈空间布局
fxied frame
64位平台上,add()方法的局部变量表初始化时的内存布局及edi寄存器指向位置
constsantPoolKlass实例区
4(%ebp)
Java程序的兼容性处理方式
n字节
new
interpreter.cpp::interpreter_init()调用Interpreter::initialize()
main方法栈,32字节
local_variable_info结构表
plong
oop i
l
thread.cppcreate_vm()
callee方法栈
TLAB分配成功
struct B整体对齐后的内存布局
6.自指
C语言所模拟的随机分配的堆栈空间布局
Exceptions属性结构表
对类A进行字段重排后的内存布局
init_obj
interprefer.cpp: interpreter_init()
Animal.say()
CallStub()函数栈顶,当前esp指向这里
真实的多线程应用程序的堆栈分布图
ACC_VOLATILE
字段是否为volatile
ACC_TRANSIENT
字段是否为transient
字段是否为enum
29字节
cplus
子结构
线程k堆栈
constantPoolCacheOop入栈后的堆栈内存布局结构
metadata=NULL
byte b1
执行istore_2指令之后的堆栈布局
post_allocation_install_obj_klass
add:rbp
物理寄存器信息
指向Java函数,即java函数所对应的method对象
eax
entry_point例程入口
callee.bp/caller.sp
内部5大类型的起始偏移量
8 (%ebp)
成员变量
占用内存空间
header
constants
12
methodData
interp_invocation_count
20
access_flags
vtable_index
Java栈帧从这里开始
int a
klassKlassOop
java.c::main()调用LoadJavaVM()
Java基本数据类型
JVM内部数据类型
数据宽度
引用类型
4字节/8字节
boolean/byte
byte
char/short
int/float
word
long/double
double
stack
data
text
执行bipush 9指令之后的堆栈布局
func1
Java局部变量表的slot槽位起始位置
局部变量1
局部变量2
callee.sp
templateInterpreter.cpp: generate_all()
栈
b=21
bp位于局部变量表之外
使用\"三维度\"模型描述constantPoolOop
真实的硬件实现的栈底和栈顶指针
stubRoutines.cppinitialize1()
ip和bp寄存器压栈
卸载
thread.cpp:: Threads::create_vm()调用init_globals()
存储该位置自己的堆栈内存地址
初始化局部变量表之前
-7(%ebp)
Java类字段域
当前步骤
8(%esp) 或者-8(%ebp)
offset=24
解析
虚函数指针
在堆/栈区创建Java类实例对象
init.c: init_globals()
以Student类演示Java类内存布局
继承自父类
b1=1
b2=2
JVM调用Java程序main()主函数的路线图
初始化constantPoolOop实例域变量
Java函数入参之前的堆栈布局
templateInterpreter_x86_32.cpp: InterpreterGenerator()
collectedHeap
占用空间(bit)
占用空间(byte)
boolean
float
long
64
存储该位置自己的对咱内存地址
operand n
operand 2
operand 1
方法指令
常量池
调用方栈底
返回地址
local 2
jni.c: JNI_CreateJavaVM()
templateInterpreter.cpp: TemplateInterpreter::initialize()
CallStub函数入参
post_allocation_install_obj_klass()
collectedHeap.inline
common_permanent_mem_allocate_noinit()
kl->as_klassOop()
public class A{private Integer age;private String name;private Boolean sex;}
线程l堆栈
lcoal2
thread2
pc() = 20
Java局部变量表的slot槽位起始位置——按一般逻辑
类已解析
字段1...字段n
entry_point例程
number_of_exceptions
exception_index_table
JVM为局部变量分配堆栈空间
cplus实例内存结构布局
constantPoolOop对象内存布局模型
Threads.c: create_vm()
线程n堆栈
cosntantPoolOop字段
long1
long2
常量池数组
CallStub分配堆栈和保存调用者现场后的内存布局
完成局部变量初始化的main()方法堆栈布局
parallelScavengeHeap.cppperm_gen()->allocate_permanent(size)
son
使用
Java方法帧的三大组成部分
多线程共用同一个堆栈空间时的一种可能的栈帧布局
Assembler
第二个例程
java.security.SecureClassLoader
result_val_address:返回地址
16(%ebp)
entry_point: Java方法调用入口例程
被调用函数
内存
constMethod对象内存分配
constantPoolOopDesc大小
JVM为常量池对象constantPool分配内存的链路
call_helper()函数栈基%ebp和%esp同时指向这里
instanceKlass字段
ClassFileParser::parse_cosntant_pool_entries()
物理机器内存
mark字段的含义
3.初始化klassOop._mark标识
0x0a1C
Java方法内部的5个局部变量
access_flags可选项
oop体系所对应的handle体系
LocalVariableTable属性结构表
运行期解析
内存地址:
0x005071
0x005072
0x005073
0x005074
存储的值:
0x04
0x03
0x02
0x01
struct A
执行完Klass:base_create_klass_oop()函数之后的klassOop内存布局
attribute_count
inner_classes_info表结构
private long l; (offset = 16)private java.lang.Integer i; (offset = 32)private long plong; (offset = 24)public char c; (offset = 12)
offset=48
ClassFileParser::parse_cosntant_pool()
类型/含义
结构
描述
CONSTANT_Utf8_infoUTF-8编码的字符串
tag
值为1
UTF-8缩略编码字符串占用字节数
长度为length的UTF-8编码字符串
CONSTANT_Integer_info整型字面量
值为3
按照高位在前存储的int值
CONSTANT_Float_info浮点型字面量
值为4
按照高位在前存储的float值
CONSTANT_Long_info长整型字面量
值为5
u8
按照高位在前存储的long值
CONSTANT_Long_info双精度浮点型字面量
值为6
按照高位在前存储的double值
CONSTANT_Class_info类或接口的符号引用
值为7
指向全限定名常量池项的索引
CONSTANT_String_info字符串类型字面量
值为8
指向字符串字面量的索引
CONSTANT_Fieldref_info字段的符号引用
值为9
指向声明字段的类或接口描述符CONSTANT_Class_info的索引项
指向字段描述符CONSTANT_NameAndType_info的索引项
CONSTANT_Methodref_info类中方法的符号引用
值为10
指向声明方法的类描述符CONSTANT_Class_info的索引项
指向名称即类型描述符CONSTANT_NameAndType_info的索引项
CONSTANT_InterfaceMethodref_info接口中方法的符号引用
值为11
指向声明方法的接口描述符CONSTANT_Class_info的索引项
指向名称及类型描述符CONSTANT_NameAndType_info的索引项
CONSTANT_NameAndType_info字段或方法的部分符号引用
值为12
指向该字段或方法名称常量项的索引
指向该字段或方法描述符常量项的索引
验证
longs变量区
offset=40
func3
Java类常量池元素数量
初始化
入参位置
帧数据
构建constantPoolOop的链路位置
散列策略下的堆栈空间布局
result_index
signature_handler
call_helper()函数栈基
constMethodOop类型字段
main()函数堆栈存储单元的相对位置
堆栈布局
class A按照指定顺序重排后的内存布局
vtables
custom class loader 2
enter()执行前
编号
常量池元素名称
tag位标识
CONSTANT_Utf8_info
UTF-8编码的字符串
CONSTANT_Integer_info
整型字面量
CONSTANT_Float_info
浮点型字面量
CONSTANT_Long_info
长整型字面量
CONSTANT_Double_info
双精度字面量
CONSTANT_Class_info
类或接口的符号引用
CONSTANT_String_info
字符串类型的字面量
CONSTANT_Fieldref_info
字段的符号引用
CONSTANT_Methodref_info
类中方法的符号引用
CONSTANT_InterfaceMethodref_info
11
接口中方法的符号引用
CONSTANT_NameAndType_info
字段和方法的名称以及类型的符号引用
Test.main()函数执行完iload_2字节码指令之后的栈帧结构
Java类字段起始偏移量
Java方法栈帧刚开始的堆栈布局
标识字符与基本数据类型对应表
CallStub入参
Dog.say()
jni.c:JNI_CreateJavaVM()
stackmap_data
constMethod_size
flags
18
code_size
22
signature_index
26
_nonstatic_field_size
小端
JVM进程内存
sourcefile_index
对CallStub(0的8个入参的ebp偏移位置按4字节为单位进行标记
void run()
执行bipush 81指令之后的堆栈布局
java.net.URLCLassLoader
stubGenerator_x86_64.cppStubGenerator_generate()
堆栈顶部栈帧
ClassFileParser::parseClassFile
无论在何种平台上,只需要开发同一套程序,无需为底层平台的不同坐特殊处理,Java提供统一的文件访问、内存申请、线程操作、GUI开发等接口
不同的是,在不同的平台上需要安装不同的JDK相同的是,只需执行同一种编译指令,便能编译程序
无论哪种平台,无论是通过命令执行打包,还是通过IDE执行打包,命令行或IDE菜单完全一致
只要安装了JVM虚拟机,便能运行,不再依赖任何其他dll或so
物理寄存器中的信息
main:rsp
解析常量池的主要链路
init_obj()
stubRoutines.cppstubRoutines_init1()
这里仅仅是一个数值,不指向内存任何地方
0 条评论
下一页