点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了3个月总结的一线大厂Java面试总结,本人已拿腾讯等大厂offer。
先瞎比比一下,上一篇文章已通过去2个多月了,你大概会问我这段时间干什么去了,怎么没有更新文章,那我告诉你,固然是面试去了,通过了一个多月的面试,身经百战,已经拿了几个offer,如今是时候把前段时间的知识储备给你们分享出来了,顺便也换种形式来给你们讲讲相关的知识。java
接下来的每篇文章都会是先给出几个问题,而后再知识点,而后再回答问题这样的形式。git
这一段面试的时间面了不少的互联网公司的大厂,也很幸运拿了几个offer,如今也仍是面试的过程当中,能够说,这么多的面试,Java虚拟机是一个必问的知识点,而垃圾回收器更是重中之重,若是面试官抛出一个垃圾回收器的问题,你一脸懵逼,那估计这个面试是凉了。github
好比,面试官一上来就狠狠的问了这几个问题。面试
再来个深一点的问题?算法
没有看过这些知识点是否是一脸懵逼。微信
好了,接下来我来说讲这些垃圾回收器都是什么神仙,面试官为何喜欢死磕这个呢?数据结构
先上一张图,这张图是Java虚拟机的jdk1.7及之前版本的全部垃圾回收器,也能够说是比较成熟的垃圾回收器,除了这些垃圾回收器,面试的时候最多也就再怼怼G1和ZGC了。多线程
上面的表示是年轻代的垃圾回收器:Serial、ParNew、Parallel Scavenge,下面表示是老年代的垃圾回收器:CMS、Parallel Old、Serial Old,以及不分老年代和年轻代的G1。之间的相互的连线表示能够相互配合使用。并发
说完是否是一篇明朗,其实也就是那么回事。数据结构和算法
Serial(串行)收集器是最基本、发展历史最悠久的收集器,它是采用复制算法的新生代收集器,曾经(JDK 1.3.1以前)是虚拟机新生代收集的惟一选择。它是一个单线程收集器,只会使用一个CPU或一条收集线程去完成垃圾收集工做,更重要的是它在进行垃圾收集时,必须暂停其余全部的工做线程,直至Serial收集器收集结束为止(“Stop The World”)。
其实对于这个垃圾回收器,你只要记住是一个单线程、采用复制算法的,会进行“Stop The World” 便可,由于面试官通常不问这个,为何,由于太简单了,没什么可问的呗。
好了,再放一张图好吧,说明一下Serial的回收过程,完事。
说明:这张图的意思就是单线程,新生代使用复制算法标记、老年代使用标记整理算法标记,就是这么简单。
ParNew收集器就是Serial收集器的多线程版本,它也是一个新生代收集器。除了使用多线程进行垃圾收集外,其他行为包括Serial收集器可用的全部控制参数、收集算法(复制算法)、Stop The World、对象分配规则、回收策略等与Serial收集器彻底相同。
须要注意一点是:除了Serial收集器外,目前只有它能和CMS收集器(Concurrent Mark Sweep)配合工做。
最后再放一张回收过程图;
* 是否是很简单,我在这里讲这些知识点并非为了深刻去了解这些原理,基本的知道对于工做已经够了,其实,主要仍是应付面试官,哈哈。
Parallel Scavenge收集器也是一个并行的多线程新生代收集器,它也使用复制算法。
Parallel Scavenge收集器的特色是它的关注点与其余收集器不一样,CMS等收集器的关注点是尽量缩短垃圾收集时用户线程的停顿时间。
这里须要注意的惟一的区别是:Parallel Scavenge收集器的目标是达到一个可控制的吞吐量(Throughput)。
咱们知道,停顿时间越短就越适合须要与用户交互的程序,良好的响应速度能提高用户体验。而高吞吐量则能够高效率地利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不须要太多交互的任务。
Serial Old 是Serial收集器的老年代版本,它一样是一个单线程收集器,使用“标记-整理”(Mark-Compact)算法。
在这里就能够出一个面试题了。
同一个爸爸,儿子长的天差地别,固然也有啊,哈哈。
其实,看了我前面的文章你可能就知道了,由于在新生代绝大多数的内存都是会被回收的,因此留下来的须要回收的垃圾就不多了,因此复制算法更合适,你能够发现,基本的老年代的都是使用标记整理算法,固然,CMS是个杂种哈。
它的工做流程与Serial收集器相同,下图是Serial/Serial Old配合使用的工做流程图:
Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法,是否是前面说的,老年代出了杂种CMS不是“标记-整理”算法,其余都是。
另外,有了Parallel Old垃圾回收器后,就出现了以“吞吐量优先”著称的“男女友”收集器了,这就是:Parallel Old和Parallel Scavenge收集器的组合。
Parallel Old收集器的工做流程与Parallel Scavenge相同,这里给出Parallel Scavenge/Parallel Old收集器配合使用的流程图:
你是否是觉得我还要讲CMS和G1,我任性,这几个面试重点仍是得死磕它,下回分解哈。
这里把上面的这些垃圾回收器作个总结,看完这个,面试给面试官讲的时候思路就很是清晰了。
收集器 | 串行、并行or并发 | 新生代/老年代 | 算法 | 目标 | 适用场景 |
---|---|---|---|---|---|
Serial | 串行 | 新生代 | 复制算法 | 响应速度优先 | 单CPU环境下的Client模式 |
Serial Old | 串行 | 老年代 | 标记-整理 | 响应速度优先 | 单CPU环境下的Client模式、CMS的后备预案 |
ParNew | 并行 | 新生代 | 复制算法 | 响应速度优先 | 多CPU环境时在Server模式下与CMS配合 |
Parallel Scavenge | 并行 | 新生代 | 复制算法 | 吞吐量优先 | 在后台运算而不须要太多交互的任务 |
Parallel Old | 并行 | 老年代 | 标记-整理 | 吞吐量优先 | 在后台运算而不须要太多交互的任务 |
好了,这回就到这里了,开头的几个问题,你会了吗?
另外,我花了3个月时间把Java学习和面试的总结整理成了一本电子书!目录以下
如今免费分享你们,在个人公众号好好学java回复Java面试便可获取。
一、老铁们,关注个人原创微信公众号「好好学java」,专一于Java、数据结构和算法、微服务、中间件等技术分享,保证你看完有所收获。
二、给俺点个赞呗,可让更多的人看到这篇文章,顺便激励下我继续写做,嘻嘻。
点赞是对我最大的鼓励↓↓↓↓↓↓