Skip to content

Commit f8aa7e5

Browse files
committed
jvm 内存划分 + 对象创建过程
1 parent cda4d91 commit f8aa7e5

File tree

1 file changed

+26
-7
lines changed

1 file changed

+26
-7
lines changed

README-Jvm.md

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,37 @@
55
## JVM理论基础 ##
66

77
### 内存划分 ###
8+
89
JVM规范,将内存分为 程序计数器、Java栈,也叫虚拟机栈、本地方法栈、方法区、堆
910

11+
| | | | |
12+
| ---- | ---- | ---- | ---- |
13+
| 线程私有 | 程序计数器 | Java虚拟机栈 | 本地方法区 |
14+
| 线程共享 | 方法区 || |
15+
1016
- 程序计数器
11-
程序指令保存,从当前指令到下一个指令,从程序计数器获取下一个指令的地址,直到执行所有的指令;线程私有
12-
- Java栈(虚拟机栈)
13-
保存方法栈帧,当调用一个方法,则新创建一个栈帧,当前的方法始终保持在栈帧的顶部;线程私有
17+
程序指令计数,从当前指令到下一个指令,从程序计数器获取下一个指令的地址,直到执行所有的指令;分支、循环、跳转都依赖于这个计数器实现;
18+
- Java虚拟机栈
19+
用于保存方法栈帧,每调用一个方法,会新创建一个栈帧,当前的方法始终保持在栈帧的顶部;存储局部变量表、动态链接、方法出口等;
1420
- 本地方法栈
15-
保存**本地方法**栈帧,当调用一个**本地方法**,则新创建一个栈帧,当前的方法始终保持在栈帧的顶部;线程私有
16-
- 方法区
17-
保存类信息、静态常量、常量;线程共享
21+
保存**本地方法**栈帧;与Java虚拟机栈类似;
1822
-
19-
保存对象,最最主要的垃圾收集之处;线程共享
23+
保存对象,几乎所有的对象都在堆中分配;最主要的垃圾收集之处;可以细分为新生代、老年代;更可以细分为Eden空间、From Survivor空间和To Survivor空间;可以通过 -Xms控制最小堆空间,-Xmx控制最大堆空间
24+
- 方法区
25+
保存类信息、常量、静态常量;运行时常量池,用于存放编译器生成的字面常量和符号引用
26+
27+
### 对象创建 ###
28+
29+
以hotspot 对象创建为例
30+
31+
1. 常量池中检查是否存在该类的符号引用?不存在,先执行类加载过程
32+
2. 根据不同垃圾收集器的压缩整理功能,采用 “指针碰撞” 或 “空闲列表” 分配方式为新生对象进行内存分配
33+
3. 内存分配过程中,要保证并发安全,采用CAS给内存分配过程加锁或将内存分配过程划分到每个线程的本地线程分配缓冲中进行;可以通过 -XX:+UseTLAB 参数控制;
34+
4. 内存分配后,将分配到的内存空间初始化零值
35+
5. 接下来,对对象的必要信息进行设置,包括对象属于哪个类的实例、对象哈希码、GC分代年龄等
36+
6. 执行<init> 方法,进行程序初始化的逻辑
37+
38+
2039

2140
### 对象存活 ###
2241

0 commit comments

Comments
 (0)