JVM分代策略

新生代

三个区的默认存放空间是Eden : From : To = 8: 1: 1

目的是因为HotSpot采用复制算法来回收新生代,设置这个比例是为了充分利用空间。

新生成的对象优先存放在新生代中,在新生代中,常规应用采取一次垃圾收集可以回收70%-90%。

新生成的对象在Eden区中分配(大对象除外,直接老年代)。

当Eden没有足够空间,虚拟机发起一次Minor GC。(只会收集一次Eden区)

GC开始时,对象只会存在于Eden区和From Suvivor区,To Survivor为空。用于复制

GC进行时,Eden区中所有存活的对象会被复制到To Survivor(连续存储),
而在From Survivor区中仍存活的对象,会根据年龄决定去向。
阈值为15,每熬过一次GC,年龄就加1,GC分代年龄值存在对象的header中,
大于15,移至老年代中,没有达到15的复制到To Survivor。
之后,From和To交换角色。From被清空,变成下一次GC的To区, 而To区成为下一次GC的From区。

无论如何,保证To区域在下一轮GC中为空的。

note: 当TO区域用于复制From中的对象时,出现空间不足的时候,需要依赖老年代分配内存进行存放。

老年代

在新生代中经历了多次的GC后存活下来的对象会进入老年代。
老年代的对象生命周期较长,存活率比较高,在老年代中进行GC的频率较低,效率也较低。

永久代

永久代中存放类信息,常量,静态变量,即时编译器编译后的代码等数据。
对此区域,Java虚拟机规范指出可以不进行垃圾收集。一般而言不会进行垃圾回收。