JAVA内存模型 (三) 堆

堆中分为两个区域,新生代,老年代。


JAVA内存模型 (三) 堆_第1张图片
heap.png

为什么会这样分?

从JVM功能考虑,并不需要这样划分。新生代存在的唯一理由是优化GC的性能
具体优点:
1.简化新对象分配(大部分对象在young分配)
2.young和old使用不同的GC算法。

重要支持

经过广泛研究,发现对象有以下特点:
1.很多对象生存时间都很短
2.新对象很少引用存活时间长的对象

Young

新生代分为三个区域
相对较大的Eden,大小相等的From Survivor和To Survivor。


JAVA内存模型 (三) 堆_第2张图片
young.png

Young规定

1.新对象会首先分配到Eden(过大会直接分配到Old)
2.GC中,Eden中对象会移动到Survivor,直到对象满足一定年龄(熬过GC一定次数),会被移动到Old。

Young GC

基于新对象生存时间短的特点,移动对象使用的是复制算法。
1.GC前,To Survivor保持清空,对象保存在Eden和From Survivor。
2.GC过程
Eden中的幸存对象复制到To Survivor。
From Survivor的幸存对象,会考虑对象年龄,1.没有达到阈值,复制到To Survivor。2.达到阈值,复制到Old。


JAVA内存模型 (三) 堆_第3张图片
YoungGC.png

3.GC完成后,Eden和From中没有幸存对象,可视为清空状态。
最后From Survivor和To Survivor调换名字,以便下次GC。

你可能感兴趣的:(JAVA内存模型 (三) 堆)