Skip to content

Commit 617c5ba

Browse files
authored
Merge pull request Snailclimb#2370 from seven17777777/patch-1
Update memory-area.md 内容补充
2 parents 33f3c2c + 761bb0e commit 617c5ba

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

docs/java/jvm/memory-area.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,10 @@ Java 堆是垃圾收集器管理的主要区域,因此也被称作 **GC 堆(
125125

126126
**JDK 8 版本之后 PermGen(永久代) 已被 Metaspace(元空间) 取代,元空间使用的是本地内存。** (我会在方法区这部分内容详细介绍到)。
127127

128-
大部分情况,对象都会首先在 Eden 区域分配,在一次新生代垃圾回收后,如果对象还存活,则会进入 S0 或者 S1,并且对象的年龄还会加 1(Eden 区->Survivor 区后对象的初始年龄变为 1),当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。对象晋升到老年代的年龄阈值,可以通过参数 `-XX:MaxTenuringThreshold` 来设置。
128+
大部分情况,对象都会首先在 Eden 区域分配,在一次新生代垃圾回收后,如果对象还存活,则会进入 S0 或者 S1,并且对象的年龄还会加 1(Eden 区->Survivor 区后对象的初始年龄变为 1),当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。对象晋升到老年代的年龄阈值,可以通过参数 `-XX:MaxTenuringThreshold` 来设置。但是设置的值应该在0-15,否则会爆出以下错误
129+
>```MaxTenuringThreshold of 20 is invalid; must be between 0 and 15```
130+
关于为什么只能是0-15,是因为关于年龄的数据存放在对象头中,对象头只占有4个字节,是0000到1111所以是0-15
131+
![image](https://github.com/Snailclimb/JavaGuide/assets/167538235/af3ae708-9d66-415d-90f9-fb12c57bb7d3)
129132

130133
> **🐛 修正(参见:[issue552](https://github.com/Snailclimb/JavaGuide/issues/552)**:“Hotspot 遍历所有对象时,按照年龄从小到大对其所占用的大小进行累加,当累加到某个年龄时,所累加的大小超过了 Survivor 区的一半,则取这个年龄和 `MaxTenuringThreshold` 中更小的一个值,作为新的晋升年龄阈值”。
131134
>
@@ -134,7 +137,7 @@ Java 堆是垃圾收集器管理的主要区域,因此也被称作 **GC 堆(
134137
> ```c++
135138
> uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) {
136139
> //survivor_capacity是survivor空间的大小
137-
> size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);
140+
> size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);//TargetSurvivorRatio 为50
138141
> size_t total = 0;
139142
> uint age = 1;
140143
> while (age < table_size) {

0 commit comments

Comments
 (0)