几个面试官常问的垃圾回收器,下次面试就拿这篇文章怼回去!

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 几个面试官常问的垃圾回收器,下次面试就拿这篇文章怼回去!

  点击上方 **好好学java **,选择 **星标 **公众号


重磅资讯、干货,第一时间送达
今日推荐:牛人 20000 字的 Spring Cloud 总结,太硬核了~

先瞎比比一下,上一篇文章已经过去2个多月了,你大概会问我这段时间干什么去了,怎么没有更新文章,那我告诉你,当然是面试去了,经过了一个多月的面试,身经百战,已经拿了几个offer,现在是时候把前段时间的知识储备给大家分享出来了,顺便也换种形式来给大家讲讲相关的知识。

接下来的每篇文章都会是先给出几个问题,然后再知识点,然后再回答问题这样的形式。

1 问题

这一段面试的时间面了很多的互联网公司的大厂,也很幸运拿了几个offer,现在也还是面试的过程中,可以说,这么多的面试,Java虚拟机是一个必问的知识点,而垃圾回收器更是重中之重,如果面试官抛出一个垃圾回收器的问题,你一脸懵逼,那估计这个面试是凉了。

比如,面试官一上来就狠狠的问了这几个问题。

  • 你可以介绍一下Java虚拟机的垃圾回收器吗?- 你可以介绍一下CMS垃圾回收器的原理吗?- 你可以介绍一下G1垃圾回收器的原理吗,跟CMS有什么区别?
    再来个深一点的问题?
  • CMS垃圾回收器哪个阶段最耗时,会不会出现stw的问题呢?
    没有看过这些知识点是不是一脸懵逼。

好了,接下来我来讲讲这些垃圾回收器都是什么神仙,面试官为什么喜欢死磕这个呢?

2 死磕垃圾回收器

先上一张图,这张图是Java虚拟机的jdk1.7及以前版本的所有垃圾回收器,也可以说是比较成熟的垃圾回收器,除了这些垃圾回收器,面试的时候最多也就再怼怼G1和ZGC了。

上面的表示是年轻代的垃圾回收器:Serial、ParNew、Parallel Scavenge,下面表示是老年代的垃圾回收器:CMS、Parallel Old、Serial Old,以及不分老年代和年轻代的G1。之间的相互的连线表示可以相互配合使用。

说完是不是一篇明朗,其实也就是那么回事。

2.1 新生代垃圾回收器

2.1.1 Serial

Serial(串行)收集器是最基本、发展历史最悠久的收集器,它是采用复制算法的新生代收集器,曾经(JDK 1.3.1之前)是虚拟机新生代收集的唯一选择。它是一个单线程收集器,只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集时,必须暂停其他所有的工作线程,直至Serial收集器收集结束为止(“Stop The World”)。

其实对于这个垃圾回收器,你只要记住是一个单线程、采用复制算法的,会进行“Stop The World” 即可,因为面试官一般不问这个,为什么,因为太简单了,没什么可问的呗。

好了,再放一张图好吧,说明一下Serial的回收过程,完事。

说明:这张图的意思就是单线程,新生代使用复制算法标记、老年代使用标记整理算法标记,就是这么简单。

2.1.2 ParNew

ParNew收集器就是Serial收集器的多线程版本,它也是一个新生代收集器。除了使用多线程进行垃圾收集外,其余行为包括Serial收集器可用的所有控制参数、收集算法(复制算法)、Stop The World、对象分配规则、回收策略等与Serial收集器完全相同。

需要注意一点是:除了Serial收集器外,目前只有它能和CMS收集器(Concurrent Mark Sweep)配合工作。

最后再放一张回收过程图;

*** 是不是很简单,我在这里讲这些知识点并不是为了深入去了解这些原理,基本的知道对于工作已经够了,其实,主要还是应付面试官,哈哈。

2.1.3 Parallel Scavenge

Parallel Scavenge收集器也是一个并行多线程新生代收集器,它也使用复制算法

Parallel Scavenge收集器的特点是它的关注点与其他收集器不同,CMS等收集器的关注点是尽可能缩短垃圾收集时用户线程的停顿时间。

这里需要注意的唯一的区别是:Parallel Scavenge收集器的目标是达到一个可控制的吞吐量(Throughput)

我们知道,停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验。而高吞吐量则可以高效率地利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务

2.2 老年代垃圾回收器

2.2.1 Serial Old

Serial Old 是Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记-整理”(Mark-Compact)算法。

在这里就可以出一个面试题了。

  • 为什么Serial使用的是复制算法,而Serial Old使用是标记-整理算法?
    同一个爸爸,儿子长的天差地别,当然也有啊,哈哈。

其实,看了我前面的文章你可能就知道了,因为在新生代绝大多数的内存都是会被回收的,所以留下来的需要回收的垃圾就很少了,所以复制算法更合适,你可以发现,基本的老年代的都是使用标记整理算法,当然,CMS是个杂种哈。

它的工作流程与Serial收集器相同,下图是Serial/Serial Old配合使用的工作流程图:

2.2.2 Parallel Old

Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法,是不是前面说的,老年代出了杂种CMS不是“标记-整理”算法,其他都是。

另外,有了Parallel Old垃圾回收器后,就出现了以“吞吐量优先”著称的“男女朋友”收集器了,这就是:Parallel Old和Parallel Scavenge收集器的组合

Parallel Old收集器的工作流程与Parallel Scavenge相同,这里给出Parallel Scavenge/Parallel Old收集器配合使用的流程图:

你是不是以为我还要讲CMS和G1,我任性,这几个面试重点还是得死磕它,下回分解哈。

3 总结

这里把上面的这些垃圾回收器做个总结,看完这个,面试给面试官讲的时候思路就非常清晰了。

|收集器|串行、并行or并发|新生代/老年代|算法|目标|适用场景
|——
|Serial|串行|新生代|复制算法|响应速度优先|单CPU环境下的Client模式
|Serial Old|串行|老年代|标记-整理|响应速度优先|单CPU环境下的Client模式、CMS的后备预案
|ParNew|并行|新生代|复制算法|响应速度优先|多CPU环境时在Server模式下与CMS配合
|Parallel Scavenge|并行|新生代|复制算法|吞吐量优先|在后台运算而不需要太多交互的任务
|Parallel Old|并行|老年代|标记-整理|吞吐量优先|在后台运算而不需要太多交互的任务

好了,这回就到这里了,开头的几个问题,你会了吗?

这是本人在这几年及春招的总结,历时3个月,我觉得很全面了,对于面试很有帮助,目前,本人已经拿到了腾讯等大厂offer,进入到大厂不是梦想,github 地址:
https://github.com/OUYANGSIHAI/JavaInterview
这么辛苦总结,给个star好不好。 点击阅读原文,直达

原文地址:https://sihai.blog.csdn.net/article/details/109465412

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 几个面试官常问的垃圾回收器,下次面试就拿这篇文章怼回去!


 上一篇
【拥抱大厂系列】几个面试官常问的垃圾回收器,下次面试就拿这篇文章怼回去! 【拥抱大厂系列】几个面试官常问的垃圾回收器,下次面试就拿这篇文章怼回去!
点个赞,看一看,好习惯!本文 GitHub 已收录,这是我花了3个月总结的一线大厂Java面试总结,本人已拿腾讯等大厂offer。 先瞎比比一下,上一篇文章已经过去2个多月了,你大概会问我这段时间干什么去了,怎么没有更新文章,那我
2021-04-04
下一篇 
面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他 面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他
初识 MyBatisMyBatis 是第一个支持自定义 SQL、存储过程和高级映射的类持久框架。MyBatis 消除了大部分 JDBC 的样板代码、手动设置参数以及检索结果。MyBatis 能够支持简单的 XML 和注解配置规则。使 Map
2021-04-04