Skip to content

Commit 7efc875

Browse files
author
zhenglin
committed
jvm内存结构
1 parent 5c2a631 commit 7efc875

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

Java-JVM/内存结构.md

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机 栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native) 方法服务。
1919
#
2020
“几乎”所有的对象实例都在这里分配内存
21-
## 堆的分代
21+
## 堆的分代(g1前)
2222
- 新生代 Eden:Survivor=8:1:1
2323
- Eden
2424
- Survivor
@@ -28,6 +28,29 @@
2828
- JVM参数 新生代:老年代=1:2
2929
- -Xms 初始值
3030
- -Xmx 最大值
31+
32+
## 新的堆内存结构
33+
34+
G1 之前的 JVM 内存模型
35+
![](../img/jvm/g1之前的垃圾收集器.png)
36+
37+
G1收集器的内存模型
38+
![](../img/jvm/G1内存布局.png)
39+
40+
堆内存会被切分成为很多个固定大小区域(Region),每个是连续范围的虚拟内存。
41+
42+
堆内存中一个区域 (Region) 的大小,可以通过 -XX:G1HeapRegionSize 参数指定,大小区间最小 1M 、最大 32M ,总之是 2 的幂次方。
43+
44+
默认是将堆内存按照 2048 份均分。
45+
46+
每个 Region 被标记了 E、S、O 和 H,这些区域在逻辑上被映射为 Eden,Survivor 和老年代。
47+
48+
存活的对象从一个区域转移(即复制或移动)到另一个区域。区域被设计为并行收集垃圾,可能会暂停所有应用线程。如上图所示,区域可以分配到 Eden,survivor 和老年代。
49+
50+
此外,还有第四种类型,被称为巨型区域(Humongous Region)。
51+
52+
Humongous 区域主要是为存储超过 50% 标准 region 大小的对象设计,它用来专门存放巨型对象。如果一个 H 区装不下一个巨型对象,那么 G1 会寻找连续的 H 分区来存储。为了能找到连续的 H 区,有时候不得不启动 Full GC 。
53+
3154
## 逃逸分析
3255
逃逸分析(Escape Analysis)是目前Java虚拟机中比较前沿的优化技术。这是一种可以有效减少Java 程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通过逃逸分析,Java Hotspot编译器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上
3356
- 逃逸分析的基本行为就是分析对象动态作用域
26.3 KB
Loading

0 commit comments

Comments
 (0)