(分代)垃圾回收的过程

 分代回收器有两个分区:

老生代和新生代,新生代默认的空间占比总空间的 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、永久代: 指的就是方法区。


版权声明:本文为weixin_52961366原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。