SUN/Oracle 的 HotSpot JVM 又把新生代进一步划分为 3 个区域:
1. 一个相对大点的区域,称为“伊甸园区 (Eden)”;
2. 两个相对小点的区域称为“From 幸存区 (survivor)” 和“To 幸存区 (survivor)”。
按照规定,新对象会首先分配在 Eden 中 (如果新对象过大,会直接分配在老年代中)。在 GC 中,Eden 中的对象会被移动到 survivor 中,直至对象满足一定的年纪 (定义为熬过 GC 的次数),会被移动到老年代。
新生代的 GC 使用复制算法:
1. 在 GC 前 To 幸存区 (survivor) 保持清空
2. Eden 中的幸存对象被复制到 To 幸存区 (survivor)。
3. 针对 From 幸存区 (survivor) 中的幸存对象
[list]
[*]a. 会考虑对象年龄,如果年龄没达到阀值 (tenuring threshold),对象会被复制到 To 幸存区 (survivor)。
[*]b. 如果达到阀值对象被复制到老年代。
[*]c. 复制阶段完成后,Eden 和 From 幸存区中只保存死对象,可以视为清空。
[/list]
4. 如果在复制过程中 To 幸存区被填满了,剩余的对象会被复制到老年代中。
5. 最后 From 幸存区和 To 幸存区会调换下名字,在下次 GC 时,To 幸存区会成为 From 幸存区。
ref:[url]http://wiki.jikexueyuan.com/project/jvm-parameter/garbage-collection.html[/url]
1. 一个相对大点的区域,称为“伊甸园区 (Eden)”;
2. 两个相对小点的区域称为“From 幸存区 (survivor)” 和“To 幸存区 (survivor)”。
按照规定,新对象会首先分配在 Eden 中 (如果新对象过大,会直接分配在老年代中)。在 GC 中,Eden 中的对象会被移动到 survivor 中,直至对象满足一定的年纪 (定义为熬过 GC 的次数),会被移动到老年代。
新生代的 GC 使用复制算法:
1. 在 GC 前 To 幸存区 (survivor) 保持清空
2. Eden 中的幸存对象被复制到 To 幸存区 (survivor)。
3. 针对 From 幸存区 (survivor) 中的幸存对象
[list]
[*]a. 会考虑对象年龄,如果年龄没达到阀值 (tenuring threshold),对象会被复制到 To 幸存区 (survivor)。
[*]b. 如果达到阀值对象被复制到老年代。
[*]c. 复制阶段完成后,Eden 和 From 幸存区中只保存死对象,可以视为清空。
[/list]
4. 如果在复制过程中 To 幸存区被填满了,剩余的对象会被复制到老年代中。
5. 最后 From 幸存区和 To 幸存区会调换下名字,在下次 GC 时,To 幸存区会成为 From 幸存区。
ref:[url]http://wiki.jikexueyuan.com/project/jvm-parameter/garbage-collection.html[/url]