分代的垃圾回收策略
基于对对象声明周期分析后得出的垃圾回收算法。
把对象分为年轻代、年老代和持久代,对不同声明周期的对象使用不同的算法
年轻代: 一个Eden区,两个Survior区 ,使用复制回收算法
所有新生成的对象首先都是放置在年轻代(Eden区)的
年轻代的目标就是尽可能快速地收集掉那些生命周期短的对象
年轻代回收过程:
1. 当Eden区满时,还存活的对象将被复制到其中一个Survivor区
2. 当这个Survior区满时,此区的存活对象被复制到另外一个Survior区
3. 当第二个Survior区也满的时候,还存活的对象(经历了从Eden->Survior1->Survior2的对象)将被复制到老年区
通过配置Survior区的个数可以增加对象在年轻代中的存在时间,减少放到老年代的可能
-XX:SurvivorRatio=4
设置年轻代中Eden区与Survivor区的大小比值
本例比值为4,则默认两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6
年老代:使用标记-清除算法
在年轻代中经历了N次垃圾回收后仍然存活的对象。
可以认为年老代中存放的都是一些生命周期较长的对象
持久代:
用于存放静态文件:java类、方法等
持久代对垃圾回收没有显著影响
有些应用(如Hibernate)可能动态生成或者调用一些class,就需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。
-XX:MaxPermSize=<N>来设置持久代大小