堆中分为两个区域,新生代,老年代。
为什么会这样分?
从JVM功能考虑,并不需要这样划分。新生代存在的唯一理由是优化GC的性能。
具体优点:
1.简化新对象分配(大部分对象在young分配)
2.young和old使用不同的GC算法。
重要支持
经过广泛研究,发现对象有以下特点:
1.很多对象生存时间都很短
2.新对象很少引用存活时间长的对象
Young
新生代分为三个区域
相对较大的Eden,大小相等的From Survivor和To Survivor。
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。
3.GC完成后,Eden和From中没有幸存对象,可视为清空状态。
最后From Survivor和To Survivor调换名字,以便下次GC。