JVM垃圾回收器
面试题
常见的垃圾回收器有哪些?
- Serial 收集器:单线程工作的收集器,在垃圾收集时,必须暂停其他所有工作线程,直到收集结束
- ParNew 收集器:Serial 收集器的多线程并行版本
- Parallel Scavenge 收集器:与 ParNew 相似,关注点是吞吐量(CPU 中运行用户代码时间/CPU 总消耗时间的比值)
- Serial Old 收集器:Serial 收集器的老年代版本;单线程收集器
- Parallel Old 收集器:Parallel Scavenge 收集器的老年代版本
- CMS 收集器:是一种以获得最短回收停顿时间为目标的收集器
- G1 收集器:具有局部收集的设计思路和基于 Region 的内存布局
CMS 收集器?
- CMS 收集器是以获取最短回收停顿时间为目标的收集器
- 基于标记 - 清除算法实现,垃圾回收过程:
- 初始标记:单线程运行,标记 GC Roots 能直达的对象
- 并发标记:无停顿,和用户线程同时运行,从 GC Roots 的直达对象开始遍历整个对象图
- 重新标记:多线程运行,需要暂停所有用户线程,修正并发标记期间产生对象
- 并发清除:无停顿,和用户线程同时执行,清理掉标记阶段判断的已经死亡的对象
- 缺点:
- 依赖 CPU 资源
- 无法处理浮动垃圾
- 收集结束会有大量空间碎片
G1 收集器
- G1 收集器:具有局部收集的设计思路和基于 Region 的内存布局
- 垃圾回收步骤:
- 初始标记:标记 GC Roots 能直达的对象
- 并发标记:和用户线程同时运行,从 GC Roots 开始遍历对象图
- 最终标记:标记在并发标记过程中产生的垃圾
- 筛选回收:指定回收计划,选择多个 Region 构成回收集,把回收集中 Region 的存活对象复制到空的 Region 中,再清理掉旧的 Region 空间
有了 CMS,为什么还要引入 G1?
CMS 有三个明显的缺点:
- 依赖对 CPU 资源
- 无法处理浮动垃圾
- 收集结束会有大量空间碎片
G1 主要解决了内存碎片多的问题
垃圾收集器应该如何选择?
- Serial:在没有停顿时间要求的单线程处理器上运行
- Parallel:优先考虑应用程序的性能,对停顿时间没有什么要求
- CMS/G1:对停顿要求和用户体验有要求的场景
秋招后端开发面试题系列目录
一、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
十二、算法
十三、项目