【BAT面试题系列】Java面试必考题JVM的最完整详解,深度解析背后原理

JVM是BAT面试中的Java必考题目。java

 

想要完美解答JVM相关的面试问题,至少须要掌握JVM的内存管理、JVM垃圾回收算法,及今天重点谈到的JVM垃圾收集器(即JVM垃圾回收算法的具体实现)。程序员

 

Mike在本篇中为你们详解,知其然,同时知其因此然,但愿可以帮助童鞋们顺利经过JVM的面试考核。面试

 

01 JVM垃圾收集器发展历程算法


第一阶段,Serial(串行)收集器缓存

在jdk1.3.1以前,java虚拟机仅仅能使用Serial收集器。 Serial收集器是一个单线程的收集器,但它的“单线程”的意义并不只仅是说明它只会使用一个CPU或一条收集线程去完成垃圾收集工做,更重要的是在它进行垃圾收集时,必须暂停其余全部的工做线程,直到它收集结束。多线程

 

第二阶段,Parallel(并行)收集器架构

Parallel收集器也称吞吐量收集器,相比Serial收集器,Parallel最主要的优点在于使用多线程去完成垃圾清理工做,这样能够充分利用多核的特性,大幅下降gc时间。并发

 

第三阶段,CMS(并发)收集器高并发

CMS收集器在Minor GC时会暂停全部的应用线程,并以多线程的方式进行垃圾回收。在Full GC时再也不暂停应用线程,而是使用若干个后台线程按期的对老年代空间进行扫描,及时回收其中再也不使用的对象。学习

 

第四阶段,G1(并发)收集器

G1收集器(或者垃圾优先收集器)的设计初衷是为了尽可能缩短处理超大堆(大于4GB)时产生的停顿。相对于CMS的优点而言是内存碎片的产生率大大下降。

 

02 JVM垃圾收集器种类


1.新生代

Serial (第一代)

PraNew (第二代)

Parallel Scavenge (第三代)

G1收集器(第四代)

 

2.老年代

Serial Old (第一代)

Parallel Old (第二代)

CMS (第三代)

G1收集器 (第四代)

详细的垃圾收集器比较,具体能够查看个人往期分享《直通BAT必考题系列:7种JVM垃圾收集器特色,优劣势、及使用场景》

JDK1.7后全新的JVM垃圾收集器G1收集器, 目标用于取代CMS收集器。

 

03 G1收集器概述


从JDK(1.3)开始,HotSpot团队一直努力朝着高效收集、减小停顿(STW: Stop The World)的方向努力,也贡献了从串行Serial收集器、到并行收集器Parallerl收集器,再到CMS并发收集器,乃至现在的G1在内的一系列优秀的垃圾收集器。

G1(Garbage First)垃圾收集器是当今垃圾回收技术最前沿的成果之一。早在JDK7就已加入JVM的收集器你们庭中,成为HotSpot重点发展的垃圾回收技术。同优秀的CMS垃圾回收器同样,G1也是关注最小时延的垃圾回收器,也一样适合大尺寸堆内存的垃圾收集,官方也推荐使用G1来代替选择CMS。

 

1.G1收集器的最大特色

G1最大的特色是引入分区的思路,弱化了分代的概念。

合理利用垃圾收集各个周期的资源,解决了其余收集器甚至CMS的众多缺陷。

 

2.G1相比较CMS的改进

算法: G1基于标记-整理算法, 不会产生空间碎片,分配大对象时不会没法获得连续的空间而提早触发一次FULL GC。

停顿时间可控: G1能够经过设置预期停顿时间(Pause Time)来控制垃圾收集时间避免应用雪崩现象。

并行与并发:G1能更充分的利用CPU,多核环境下的硬件优点来缩短stop the world的停顿时间。

 

3.CMS和G1的区别

CMS中,堆被分为PermGen,YoungGen,OldGen;而YoungGen又分了两个survivo区域。在G1中,堆被平均分红几个区域(region),在每一个区域中,虽然也保留了新老代的概念,可是收集器是以整个区域为单位收集的。

G1在回收内存后会立刻同时作合并空闲内存的工做、而CMS默认是在STW(stop the world)的时候作。

G1会在Young GC中使用、而CMS只能在O区使用。

 

4.G1收集器的应用场景

G1垃圾收集算法主要应用在多CPU大内存的服务中,在知足高吞吐量的同时,尽量的知足垃圾回收时的暂停时间。

就目前而言、CMS仍是默认首选的GC策略、可能在如下场景下G1更适合,服务端多核CPU、JVM内存占用较大的应用(至少大于4G),应用在运行过程当中会产生大量内存碎片、须要常常压缩空间,想要更可控、可预期的GC停顿周期,防止高并发下应用雪崩现象。

 

04 G1的堆内存算法


1.G1以前的JVM内存模型

新生代:伊甸园区(eden space) + 2个幸存区

老年代

持久代(perm space):JDK1.8以前

元空间(metaspace):JDK1.8以后取代持久代

 

2.G1收集器的内存模型

1)G1堆内存结构

堆内存会被切分红为不少个固定大小区域(Region),每一个是连续范围的虚拟内存。

堆内存中一个区域(Region)的大小能够经过-XX:G1HeapRegionSize参数指定,大小区间最小1M、最大32M,总之是2的幂次方。

默认把堆内存按照2048份均分。

 

2)G1堆内存分配

每一个Region被标记了E、S、O和H,这些区域在逻辑上被映射为Eden,Survivor和老年代。

存活的对象从一个区域转移(即复制或移动)到另外一个区域。区域被设计为并行收集垃圾,可能会暂停全部应用线程。

如上图所示,区域能够分配到Eden,survivor和老年代。此外,还有第四种类型,被称为巨型区域(Humongous Region)。Humongous区域是为了那些存储超过50%标准region大小的对象而设计的,它用来专门存放巨型对象。若是一个H区装不下一个巨型对象,那么G1会寻找连续的H分区来存储。为了能找到连续的H区,有时候不得不启动Full GC。

 

05 G1回收流程


在执行垃圾收集时,G1以相似于CMS收集器的方式运行。

 

G1收集器的阶段分如下几个步骤:

1) G1执行的第一阶段:初始标记(Initial Marking )

这个阶段是STW(Stop the World )的,全部应用线程会被暂停,标记出从GC Root开始直接可达的对象。

2)  G1执行的第二阶段:并发标记

从GC Roots开始对堆中对象进行可达性分析,找出存活对象,耗时较长。当并发标记完成后,开始最终标记(Final Marking )阶段。

3)  最终标记(标记那些在并发标记阶段发生变化的对象,将被回收)。
4)  筛选回收(首先对各个Regin的回收价值和成本进行排序,根据用户所期待的GC停顿时间指定回收计划,回收一部分Region)。

最后,G1中提供了两种模式垃圾回收模式,Young GC和Mixed GC,两种都是Stop The World(STW)的。

 

06 G1的GC模式


1.YoungGC年轻代收集

在分配通常对象(非巨型对象)时,当全部eden region使用达到最大阀值而且没法申请足够内存时,会触发一次YoungGC。每次younggc会回收全部Eden以及Survivor区,而且将存活对象复制到Old区以及另外一部分的Survivor区。

 

YoungGC的回收过程以下:

1)根扫描,跟CMS相似,Stop the world,扫描GC Roots对象。

2)处理Dirty card,更新RSet。

3)扫描RSet,扫描RSet中全部old区对扫描到的young区或者survivor去的引用。

4)拷贝扫描出的存活的对象到survivor2/old区。

5)处理引用队列,软引用,弱引用,虚引用。

 

2.mixed gc

当愈来愈多的对象晋升到老年代old region时,为了不堆内存被耗尽,虚拟机会触发一个混合的垃圾收集器,即mixed gc,该算法并非一个old gc,除了回收整个young region,还会回收一部分的old region,这里须要注意:是一部分老年代,而不是所有老年代,能够选择哪些old region进行收集,从而能够对垃圾回收的耗时时间进行控制。

G1没有fullGC概念,须要fullGC时,调用serialOldGC进行全堆扫描(包括eden、survivor、o、perm)。

07 G1的推荐用例
G1的第一个重要特色是为用户的应用程序的提供一个低GC延时和大内存GC的解决方案。这意味着堆大小6GB或更大,稳定和可预测的暂停时间将低于0.5秒。

若是应用程序使用CMS或ParallelOld垃圾回收器具备一个或多个如下特征,将有利于切换到G1:

Full GC持续时间太长或太频繁

对象分配率或年轻代升级老年代很频繁

不指望的很长的垃圾收集时间或压缩暂停(超过0.5至1秒)

注意:若是你正在使用CMS或ParallelOld收集器,而且你的应用程序没有遇到长时间的垃圾收集暂停,则保持与您的当前收集器是很好的,升级JDK并没必要要更新收集器为G1。

-end-

 

往期热文:

高并发架构系列:Redis缓存和MySQL数据一致性方案详解

码了几年代码的程序员,有必定的开发经验,应该如何提高本身?

最全BAT等大厂Java 面试题目1000+,能答对70%就去BATJTMD试试~

 

以为不错请点赞支持,欢迎留言或进个人我的群179961551领取【100期架构资料专题合集】、【1000+道大厂JAVA面试真题】,本群专用于学习交流技术、分享面试机会,拒绝广告,我也会在群内不按期答题、探讨。

相关文章
相关标签/搜索