分代回收器有两个分区:
老生代和新生代,新生代默认的空间占比总空间的 1/3,老生代的默认占比是 2/3。
新生代使用的是复制算法,新生代里有 3 个分区:Eden、To Survivor、From Survivor,它们的默认占 比是 8:1:1,它的执行流程如下: 当年轻代中的Eden区分配满的时候,就会触发年轻代的GC(Minor GC)。
具体过程如下:
1、在Eden区执行了第一次GC之后,存活的对象会被移动到其中一个Survivor分区(以下简称from)
2、Eden区再次GC,这时会采用复制算法,将Eden和from区一起清理。存活的对象会被复制到to 区。接下来,只需要清空from区就可以了
对象是怎么从年轻代进入老年代的
这是老掉牙的题目了。在下面四种情况下,对象会从年轻代进入老年代。 1、如果对象够老,会通过提升(Promotion)进入老年代,这一般是根据对象的年龄进行判断的。
2、动态对象年龄判定。有的垃圾回收算法,比如G1,并不要求age必须达到15才能晋升到老年代,它 会使用一些动态的计算方法。
3、分配担保。当 Survivor 空间不够的时候,就需要依赖其他内存(指老年代)进行分配担保。这个时候, 对象也会直接在老年代上分配。
4、超出某个大小的对象将直接在老年代分配。不过这个值默认为0,意思是全部首选Eden区进行分配。
. 新生代、老年代、持久代都存储哪些东西
1、新生代:
1.方法中new一个对象,就会先进入新生代。
2、老年代:
1. 新生代中经历了N次垃圾回收仍然存活的对象就会被放到老年代中。
2. 大对象一般直接放入老年代。
3. 当Survivor空间不足。需要老年代担保一些空间,也会将对象放入老年代。
3、永久代: 指的就是方法区。