垃圾收集方式


垃圾收集算法

1、标记清除算法

      标记清除算法分为标记和清除两个阶段,首先标记出所要回收的对象,在标记完后统一回收所有被标记的对象。有两点不足,一是效率问题,标记清除两个过程的效率都不高;另外一个是标记清楚之后会产生大量的不连续碎片,碎片太多会导致以后无法分配大对象。

2、赋值算法

     将可用的内容按照容量划分为大小相等的两块,每次只使用其中的一块,当另外一块用完了,就将还存活的对象复制到另外一块中,然后再把已经使用的那一块做一次清理。主要用于新生代。

3、标记-整理算法

     同样也分为两个阶段,首先标记处要回收的对象,然后第二个阶段是把所有的存活的对象移动到一端,然后直接清理掉端边界以外的内存。标记回收算法主要用于老年代。

4、为什么复制算法用于新生代,标记整理算法用于老年代。

     在新生代,每次垃圾回收时都有大批量的对象死去,只有少量的存活,那么选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代对象存活的对象比较多,没有额外的空间对它进行分配担保,就必须使用 标记-清理或者标记-整理算法来进行回收。

分配与回收

1、新生代对象GC

     新生的对象一开始主要是分配在堆中的新生代Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配,少数情况下也会直接分配在老年代中。

对象在新生代Eden中进行分配,当Eden区没有足够的空间进行分配时,虚拟机将发生一次MinorGC。如果在E区GC完并且存活的对象可以在S区存放的话那么将存放在S区中的其中一个里面,如果不能存放的话将放在老年代。

2、新生代对象存活年龄

   虚拟机会为每个对象定义一个对象的年龄计数器。如果对象在E区经过MinorGC后仍然能够存活,并且可以被S区容纳的话对象将被移动到S区,并且对象的年龄设置为1,。对象在S区每熬过一个MinorGC年龄就会+1,当它的年龄增加到一定的程度之后(默认是15岁),就会晋升到老年代。对象晋升到老年代的年龄阀值可以通过参数设定。

    虚拟机并不是永远的要求年龄必须达到设置的晋升年龄才可以去老年代,如果在S区中相同年龄所有对象的大小总和大于S区的一半,那么年龄大于或等于该年龄的对象直接进入老年代。

3、老年代的空间分配担保

   在每次MinorGC之前,虚拟机会首先检查老年代最大可用的连续空间是否大有新生代所有对象的总和,如果这个条件成立,那么MinorGC可以确保是安全的,如果不成立那么虚拟机会检查是否设置开启了允许担保失败,如果允许的话,那么虚拟机将会检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将进行MinorGC,尽管这次GC是有风险的;如果小于或者是没有设置允许担保失败,那么将进行一次Full GC.

   历次晋升到老年代对象的平均大小只是一种动态概率手段,如果MinorGC之后存活对象突增,远远高于平均值,依然担保失败,这时会重新发起一次Full GC,虽然绕了一个大圈子,但是这样尽量的避免Full GC.

MinorGC与FullGC区别

    MinorGC发生在新生代,一般速度比较快。

   FullGC或者MajorGC一般是指老年代GC,并且速度比较慢。FullGC表示发生了Stop-The-Word

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值