面试:JVM垃圾回收

一、三种垃圾回收算法

1、标记清除(已废弃)

  • 找到根对象(局部变量正在引用的对象、静态变量正在引用的对象);
  • 沿着根对象的引用链,查看当前的对象是否被根对象所引用,若被引用,则加上标记;
  • 加标记的对象保留下来,其余的释放掉;

缺点:

  1. 会造成内存碎片问题;

因为未被引用的对象一般不连续,所以当需要一段连续的内存时,每一段内存都不够用;

2、标记整理(老年代)

  • 前三步和标记清除法一致;
  • 在清除后会将引用对象整理为一段连续的内存,从而避免了内存碎片的问题;

缺点:

  1. 效率较低:

因为有整理的操作,会有引用地址的重新计算内存复制

3、标记复制(新生代)

将存活的对象复制到新的内存空间中,将原来的内存直接删掉。

缺点:

  1. 占用了一份额外的内存;
  2. 当存活对象较多时,会复制很多次;

二、GC和分代回收算法

GC的目的在于实现无用对象内存自动释放,减少内存碎片、加快分配速度

  1. 回收区域是堆内存,不包括虚拟机栈,在方法调用结束会自动释放方法占用内存。
  2. 判断无用对象,使用可达性分析算法三色标记法标记存活对象,回收未标记对象
  3. GC具体的实现称为垃圾回收器
  4. GC大都采用了分代回收思想,理论依据是大部分对象朝生夕灭,用完立刻就可以回收,另有少部分对象会长时间存活,每次很难回收,根据这两类对象的特性将回收区域分为新生代和老年代,不同区域应用不同的回收策略。
  5. 根据GC的规模可以分成 Minor GCMixed GC,Full GC。

1、分代回收

  1. 伊甸园eden,最初对象都分配到这里,与幸存区合称新生代
  2. 幸存区survivor,当伊甸园内存不足,回收后的幸存对象到这里,分成 from和to,采用标记复制算法
  3. 老年代 old,当幸存区对象熬过几次回收(最多15次),晋升到老年代(幸存区内存不足或大对象会导致提前晋升)

2、GC规模

  • Minor GC发生在新生代的垃圾回收,暂停时间短
  • Mixed GC新生代+老年代部分区域的垃圾回收,G1收集器特有
  • Full GC新生代+老年代完整垃圾回收,暂停时间长,应尽力避免

三、三色标记与并发漏标问题

  • 黑色–已标记
  • 灰色–标记中
  • 白色–还未标记

1、lncremental Update

  • 只要赋值发生,被赋值的对象就会被记录(用户线程结束后,重新检查引用)

2、Snapshot At The Beginning,SATB

  • 新加对象会被记录(用户线程结束后,重新检查引用)
  • 被删除引用关系的对象也被记录

四、垃圾回收器

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qing_ti_xx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值