JVM垃圾回收算法常见知识点&面试题总结

本文详细解释了JVM的垃圾回收算法,包括标记-清除、标记-复制、标记-整理等策略,新生代的区域划分,以及MinorGC、YoungGC、MajorGC/OldGC、MixedGC和FullGC的区别和触发条件。还探讨了如何优化新生代空间以减少MinorGC频率。
摘要由CSDN通过智能技术生成


JVM垃圾回收算法

面试题

垃圾收集有哪些算法,各自的特点?

虚拟机的垃圾回收机制是一种自动内存管理的机制,用于回收不再被程序使用的内存,以便将其释放并重新分配给新的对象

常见的垃圾回收策略有:

标记 - 清除:

  • 标记阶段:标记所有需要回收的对象
  • 清除阶段:回收被标记的对象,但会产生内存碎片,影响内存利用率

标记 - 复制:

  • 将内存分为两块,一块称为 “From” 空间,一块称为 “To” 空间
  • 标记阶段,将存活对象复制到 “To” 空间
  • 清除阶段,清空 “From” 空间
  • 适用于存活率较低的场景,避免了碎片化

标记 - 整理:

  • 标记阶段标记所有需要回收的对象
  • 清除阶段将所有存活的对象向一端移动,然后清除边界以外的内存
  • 避免碎片化

分代收集算法:

  • 根据对象的存活周期将堆划分为不同的区域(一般分为新生代和老年代)
  • 针对不同区域使用不同的收集算法,新生代一般使用复制算法,老年代使用标记 - 清除或标记 - 整理算法
  • 根据大部分对象在新生代快速回收和老年代存活较长的特点,分代收集算法可以提高垃圾回收效率

说一下新生代的区域划分?

  • 新生代的垃圾收集主要采用标记 - 复制算法,因为新生代的存活对象较少,每次复制少量的存活对象效率较高
  • 新生代分为 Eden 空间和两块较小的 Survivor 空间,每次分配内存只使用 Eden 和其中一块 Survivor 空间
  • 当发生垃圾收集时,将 Eden 和 Survivor 中仍然存活的对象复制到另一块 Survivor 空间后清理空间

Minor GC/Young GC、Major GC/Old GC、Mixed GC、Full GC?

  • 部分收集 (Partial GC):目标不是完整收集整个 Java 堆的垃圾收集
    • 新生代收集 (Minor GC/Young GC):指目标只是新生代的垃圾收集
    • 老年代收集 (Major GC/Old GC):指目标只是老年代的垃圾收集,只有 CMS 收集有这种行为
    • 混合收集 (Mixed GC):目标是收集整个新生代以及部分老年代的垃圾收集,只有 G1 收集有这种行为
  • 整堆收集 (Full GC):收集整个 Java 堆和方法区的垃圾收集

Minor GC/Young GC 什么时候触发?

  • 新创建的对象会先在新生代 Eden 区进行分配
  • 如果 Eden 区没有足够的空间,就会触发 Minor GC 来清理新生代

什么时候会触发 Full GC?

  • Young GC 之前检查老年代:在要进行 Young GC 的时候,发现老年代可用的连续空间小于平均升级对象大小,触发 Full GC
  • 老年代空间不足:如果老年代内存使用率过高,就会触发 GC
  • System.gc() 命令:使用命令执行 Full GC

频繁 minor gc 怎么办?

通常情况下,由于新生代空间较小,Eden 空间很快就满了,就会频繁 Minor GC
可以通过增大新生代空间来降低 Minor GC 频率

HotSpot 为什么要分为新生代和老年代?

  • 是为了更好地适应不同对象的生命周期和垃圾收集算法,从而提高垃圾回收的效率和性能

对象什么时候会进入老年代?/ 内存分配和回收原则?

  • 长期存活的对象将进入老年代:在对象的头信息中存储对象的迭代年龄,迭代年龄会在每次 Young GC 中增加一,当年龄达到 15 时,对象将进入老年代
  • 大对象直接进入老年代:占用大量连续内存空间的对象在被加载就会直接进入老年代
  • 动态对象年龄判定:如果相同年龄的对象占一半以上,则年龄大于等于该年龄的对象直接进入老年代
  • 空间分配担保:在 Young GC 后,新生代仍然有大量对象存活,就需要老年代进行分配担保,把 Survivor 无法容纳的对象送入老年代

秋招后端开发面试题系列目录
一、Java
1.1 Java基础上
1.2 Java基础下
1.3 Java集合
1.4 JavaIO
1.5 Java多线程上
1.6Java多线程下
二、JVM
2.1 JVM底层原理
2.2 垃圾回收器
2.3 垃圾回收算法
2.4 类加载机制
2.5 运行时数据区
三、MySQL
3.1 MySQL基础
3.2 事务
3.3 索引
3.4 锁机制
3.5 MVCC
四、Redis
4.1 Redis基础
4.2 缓存原理
五、中间件
5.1 RabbitMQ
六、Spring开源框架
6.1 Spring
6.2 Spring MVC
6.3 Spring Boot
6.4 MyBatis
七、操作系统
八、计算机网络
九、设计模式
十、微服务架构
十一、Spring Cloud分布式
11.1 分布式基础
11.2 Spring Cloud
11.3 GateWay
11.4 Nacos
11.5 OpenFeign
11.6 Ribbon
十二、算法
十三、项目

  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值