高频面试题-请把Java垃圾回收器说清楚!

简介: 今天我们来说一下Java中的垃圾回收器,之前的文章说了垃圾回收算法,这次要说的垃圾回收器会是更深层的较量。深入理解Java虚拟机一书中写到:如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。

不同的时代,出现了不同了垃圾收集器,它们被不断的应用在各个版本的Java虚拟机中。

首先来画一张图,将具体的几个垃圾收集器展示出来。

909a4695027882535ba673573e2dec5.png


上图就是我们要说的一共七种收集器,图中一共分为两大部分,上半部分(Serial、ParNew、Parallel Scavenge)分属于新生代收集器,下半部分(CMS、Serial Old、ParNew Old)分属于老年代收集器,而G1算是一个特殊的收集器,因为其不分新生代和老年代。


收集器的迭代


JDK1.3.1之前,Serial收集器是唯一的新生代收集器,可以说除此之外,毫无选择。

JDK1.3.1之后,就出现了Parallel、CMS、G1等等的收集器。

从JDK1.7 Update14之后,其虚拟机中的收集器正式更换为G1收集器。


几个非常重要的概念


Stop The World(垃圾收集停顿机制): 当垃圾收集器在进行垃圾收集时,必须要暂停其他的所有线程,这个暂停状态将会持续到本次垃圾收集任务结束;这个过程就是Stop The World,可以说这就是一个垃圾收集停顿机制,也是所有垃圾收集器都会有的机制,毕竟每次收集时就停顿线程,给系统会造成一定程度的延迟。

虽然没办法解决必须停顿所有线程的问题,但是经过多年的努力,多个版本垃圾收集器的更新换代,这个停顿过程也越来越短。


Throughput(吞吐量): 运行用户代码时间 / (运行用户代码时间 + 垃圾收集停顿时间),吞吐量越大,代表着收集器性能越好。


收集器中的并发和并行:

(1)并发,垃圾收集任务与工作线程并发执行,但这并不代表就不会存在停顿时间,只是会大幅度减少停顿时间。

(2)并行,在收集过程中,并行执行多个收集任务,以此来减少Stop The World带来的停顿时间,从而提高垃圾收集的性能。


Minor GC和Full GC:

Minor GC:新生代GC,在新生代内存中的垃圾收集工作,具有执行频繁、回收速度快等特点。

Full GC:老年代GC,在老年代内存中的垃圾收集工作,老年代GC还被称作Major GC,在执行时,可能会执行一次Minor GC,但是这个Minor GC不一定会执行;当然了,Full GC的执行速度要比Minor GC的执行速度要慢数倍之多。


Serial收集器


收集区域:新生代

使用算法:复制算法

是否支持并行:不支持,单线程收集器。

是否支持并发:不支持


号称年龄最大、最基本的收集器,作为单线程收集器,简单高效是它与其他单线程收集器之间的优势;也是因为单线程的缘故,没了线程之间的交互开销,在一定程度上,比如轻量应用级系统,就造就了其简单高效的应用模式。


这里也说一下其进行垃圾收集时的大概过程:

(1)单线程执行GC,并且暂停所有的工作线程。

(2)采用复制算法进行收集。

(3)收集完成后,则将工作线程开启。这里还可能会继续进行Full GC。


ParNew


收集区域:新生代

使用算法:复制算法

是否支持并行:支持,多线程收集器。

是否支持并发:不支持


ParNew收集器可以说成是Serial收集器的多线程版本,除了是并行处理收集工作之外,其余的特征都与Serial收集器相同。

在单CPU的环境中,一定还是Serial收集器是最优选,因为多了线程交互,所以在多CPU的服务器环境下,ParNew收集器的性能还是优于Serial收集器的。


ParNew的工作过程大概是以下这样:

(1)多线程执行GC,并且暂停所有的工作线程。

(2)采用复制算法进行收集。

(3)收集完成后,则将工作线程开启。这里还可能会继续进行Full GC。


Parallel Scavenge


收集区域:新生代

使用算法:复制算法

是否支持并行:支持,多线程收集器。

是否支持并发:不支持


Parallel Scavenge收集器这个收集器与其他收集器不同的地方,就在于其目的是为了控制吞吐量,其他收集器则是为了尽可能的提高吞吐量,也就是降低、缩短收集工作进行时的停顿时间。


Parallel Scavenge收集器为了控制吞吐量,特定的提供了两个参数来实现吞吐量。

-XX:MaxGCPauseMillis(最大垃圾收集停顿时间):设置一个毫秒值,收集器会尽可能的保证内存的回收时间不超过这个值,并不会使收集速度变快。


-XX:GCTimeRatio(吞吐量大小):0-100的整数,这个值就代表着垃圾收集时间在整个收集过程时间的比例。


Parallel Scavenge收集器也被称为吞吐量收集器,还可以通过-XX:SurvivorRatio参数设置Eden区和Survivor区的比例。


Serial Old


收集区域:老年代

使用算法:标记-整理算法

是否支持并行:不支持,单线程收集器。

是否支持并发:不支持


与Serial收集器略有不同,但是两者的收集工作过程没什么差异。


Parallel Old


收集区域:老年代

使用算法:标记-整理算法

是否支持并行:支持,多线程收集器。

是否支持并发:不支持


Parallel Old从JDK1.6中开始提供使用,在对吞吐量要求高的情况,或者是CPU资源敏感的情况下,还是比较推荐考虑此收集器的。


CMS


收集区域:老年代

使用算法:标记清楚算法

是否支持并行:支持,多线程收集器。

是否支持并发:支持


CMS,全称Concurrent Mark Sweep,旨在获取最短回收停顿时间为目标的收集器,CMS相对比较经典,为了实现它的目标,它使用了四步来实现收集过程。

(1)初始标记(2)并发标记(3)重新标记(4)并发清除


这样就能消除Stop The World了吗?那是不可能的,在初始标记、并发标记时依然会出现Stop The World。


具体的这四步主要去干了点什么,咱们回头在另一篇文章里再说。

这里还需要注意一点,那就是CMS是使用的标记-清楚算法,那就注定会产生大量的内存碎片,这个在面试官嘴里会常问哦。


G1


收集区域:全部

使用算法:复制算法

是否支持并行:支持,多线程收集器。

是否支持并发:支持


G1其实是可以单独拿出一篇文章来写一下的,之后会做个详细解释,今天我们就只来看一下G1的几个特点。


1.并行、并发共存,在多CPU多核的资源下,能更有效的缩短Stop The World停顿的时间。

2.虽然是只用一个收集器就将所有的内存进行清理,但是依然会进行分代收集,只不过是采用了不同的方式去处理。

3.因为是管理着全部内存,所以,在空间维度上,G1将内存分为多个Region空间,以此来解决用复制算法来收集的情况。

4.G1还有一个优势就是,能可预测停顿时间。


组合使用策略


七种垃圾收集器,除了G1将新生代和老年代全部负责之外,其余的六种如何来搭配组合呢?

从名称上来,Serial和Serial Old是可以组合的,Parallel Scavenge和Parallel Old是可以组合的。


那么从现实的角度出发,Serial可以与Serial Old、CMS进行组合,因为ParNew等同于Serial的多线程版本,所以ParNew和Serial一样,都可以与Serial Old、CMS进行组合。

Parallel Scavenge收集器除了能和Parallel Old收集器配合使用,还能和Serial Old收集器进行组合。

来,上图,更清楚一些,12fee076f0ad9cae34f6371fd6981eb.png


到这里,七种收集器就全部说完了,只有了解了本质后,我们也就可以逐渐进行调优的知识储备了,基础最重要。

目录
相关文章
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
813 1
|
存储 安全 Java
常见 JAVA 集合面试题整理 自用版持续更新
这是一份详尽的Java集合面试题总结,涵盖ArrayList与LinkedList、HashMap与HashTable、HashSet与TreeSet的区别,以及ConcurrentHashMap的实现原理。内容从底层数据结构、性能特点到应用场景逐一剖析,并提供代码示例便于理解。此外,还介绍了如何遍历HashMap和HashTable。无论是初学者还是进阶开发者,都能从中受益。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
541 3
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
779 0
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
存储 安全 Java
2025 最新史上最全 Java 面试题独家整理带详细答案及解析
本文从Java基础、面向对象、多线程与并发等方面详细解析常见面试题及答案,并结合实际应用帮助理解。内容涵盖基本数据类型、自动装箱拆箱、String类区别,面向对象三大特性(封装、继承、多态),线程创建与安全问题解决方法,以及集合框架如ArrayList与LinkedList的对比和HashMap工作原理。适合准备面试或深入学习Java的开发者参考。附代码获取链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
6660 50
|
Java 数据库连接 数据库
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
本文全面总结了Java核心知识点,涵盖基础语法、面向对象、集合框架、并发编程、网络编程及主流框架如Spring生态、MyBatis等,结合JVM原理与性能优化技巧,并通过一个学生信息管理系统的实战案例,帮助你快速掌握Java开发技能,适合Java学习与面试准备。
604 2
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
|
算法 Java
50道java基础面试题
50道java基础面试题
|
NoSQL Java 微服务
2025 年最新 Java 面试从基础到微服务实战指南全解析
《Java面试实战指南:高并发与微服务架构解析》 本文针对Java开发者提供2025版面试技术要点,涵盖高并发电商系统设计、微服务架构实现及性能优化方案。核心内容包括:1)基于Spring Cloud和云原生技术的系统架构设计;2)JWT认证、Seata分布式事务等核心模块代码实现;3)数据库查询优化与高并发处理方案,响应时间从500ms优化至80ms;4)微服务调用可靠性保障方案。文章通过实战案例展现Java最新技术栈(Java 17/Spring Boot 3.2)的应用.
1160 9
|
算法 架构师 Java
Java 开发岗及 java 架构师百度校招历年经典面试题汇总
以下是百度校招Java岗位面试题精选摘要(150字): Java开发岗重点关注集合类、并发和系统设计。HashMap线程安全可通过Collections.synchronizedMap()或ConcurrentHashMap实现,后者采用分段锁提升并发性能。负载均衡算法包括轮询、加权轮询和最少连接数,一致性哈希可均匀分布请求。Redis持久化有RDB(快照恢复快)和AOF(日志更安全)两种方式。架构师岗涉及JMM内存模型、happens-before原则和无锁数据结构(基于CAS)。
452 5