【刨根问底】之JVMpart3(垃圾算法,FullGC本质,对象存活判定,GCroot,常用垃圾收集器概述,CMS垃圾收集器详解)

1.垃圾收集器常用算法

1.1复制算法

该算法底层逻辑实际为将存储空间一分为二,只使用其中的一般存储,若存储满,则将还存活的复制到另一半,将原本部分直接全部清除——该算法速度快而且不会留下内存碎片,而代价是存储空间只使用了一半,名副其实的空间换时间
,而实际上在对象的一生中所演示的逻辑就是复制算法的优化——当大部分对象都是朝生暮死的情况下,存储空间并不需要对半分,从而实际支付的空间代价变得很小

1.2标记——清除法

该算法的逻辑十分简单,将存活的对象进行标记,之后,将未被标记的对象定义为已经死亡,之后直接进行删除——但是需要注意的是,他们不会进行内存碎片空间的整理

1.3标记——整理法

在标记清除法的基础上会进行碎片空间的优化,实际上,其与标记清除法的效率差距为几十微妙到数秒钟的差距,因而一般的配置上,执行这两种算法的收集器会同时使用

1.4如何判定存活的对象

以上三种算法的介绍中都笼统的表示了所谓的存活的对象,而这些对象该如何判定为存活呢,一般来说有两种判定方法:
1.引用计数法
对所有存在的对象的引用进行计数,若某个对象的引用数量为0,则将其判定为死亡——但是很明显,若两个对象互相引用,且他们已经死亡,那么该种算法并不能把它们判断为死亡,继而出现了新的算法
2.可达性分析法
该种算法将会定义下数个确定活跃的引用,以其作为根即GCroot,根据对象之间的引用进行图遍历,对于无法遍历到的对象,判定为已死亡,该种算法是目前的主流

1.4如何判定GCroot

首先他们是一系列确定活跃的引用,除了那些JVM环境自带的默认引用以外,包括现在正在处于运行状态的方法的所有引用,值得注意的是,在执行新生代的MinorGC时,老年代对新生代的引用也将会作为GCroot

2.细谈java常用的垃圾收集器

在这里插入图片描述
图中为常见的垃圾收集器之间的关系进行了描述,未连线的收集器之间表明他们无法联用,可以看出,jdk的启用收集器的选择可以分为三类,Serial-ParNew-CMS-Serial Old,Parallel-Parallel Old以及G1,这之中,由于CMS类型收集器带来的迅速响应,并且G1相对而言出现较晚需要一定的时间调研,因而大部分的应用都选择CMS-ParNew作为jdk的收集器,而这之中,负责司职老年代的CMS收集器是我们在GC讨论中的首要对象

2.1CMS收集器详解

1.其备案GC收集器为SerialOld,CMS的高速响应是建立在它使用的算法为标记-清除算法的基础上的,这将会带来一个后果,CMS清理后将会产生大量的空间碎片,从而出现剩余空间比将要放入的对象大,但是却因为没有足够大的连续空间而导致的concurrent mode fail,因而此时,CMS将会要求执行标记-整理算法的serial Old收集器执行一次FullGC——这将会导致一次极其漫长的停顿,与正常的一次CMS GC花费几十微秒相比,serial Old GC可能会花费数秒的时间

2.其回收的目标只包括老年代的回收也就是说,只为FullGC服务,FullGCMajorGC针对老年代的GC==CMS执行的任务的一部分

3.FullGC的本质,或者说系统所记录的发生的FullGC指的是CMS在工作期间,发出了STOP THE WORLD命令的这部分操作

4.pass:STOP THE WORLD:在执行GC工作时,为了避免产生对象被挪动导致引用标记错误等情况,GC将会主动要求暂停jvm中的全部线程,当然这是非常影响效率的行为,因而收集器执行工作时会做哪些步骤,其中哪些会导致STW是热门讨论点

5.CMS收集器执行任务的步骤,共有七步,其中有两步是会启动STW的
第一步:初步标记
将会导致STW,初步进行标记,标记范围包括GCroot引用的对象这些对象中处于新生代的对象,能够到达的第一个旧生代的对象,如此处,被标记的有三个对象
在这里插入图片描述

第二步:并发标记
此阶段不会进行STW,为并发运行,程序正在同步运行,因此,对象之间的引用可能发生变化,其要做的事的核心为,将第一阶段标记的对象能够到达的对象全部标记,以及,将上一阶段标记的对象之中,引用发生了变化的对象记录为"dirty",同时,这种对象所在的区域被定义为"dirty Card"
在这里插入图片描述
第三步:预清理
在这个阶段,首先它将会把对象引用产生改变的对象所新引用的对象进行标记,标记后,将取消dirty标记,同时,会做一些必要的清理与最终标记阶段的准备工作
在这里插入图片描述
第四步:可终止的预清理
此阶段将会尽可能的为最终阶段清理分担任务,本质上做的是与第三步一模一样的行为,增加这个阶段是为了可以方便的定义并发标记的持续时间,因此该阶段的持续时间由多个条件决定,如执行的次数,执行的时间,新生代的干净程度(是否都已经进入老年代或者被释放)等其中一项到达阈值后,将会进入下个阶段
第五步:最终标记阶段
第二次启动STW,由于用户程序在执行过程中对象间的引用在持续变化,为了不出现漏标情况,在第四步达成终止条件后,将会暂停全部线程,将全部可达对象进行标记
第六步:清理阶段
释放全部被判断为死亡的对象,与用户程序并发执行
在这里插入图片描述
第七步:初始化CMS
初始化收集器,为下次运行做准备

6.CMS为什么被称为划时代的垃圾收集器

首先,CMS是一款并发处理器,在这里,我想应该先说明白垃圾收集器的两个指标:吞吐量暂停时间

6.1吞吐量与暂停时间

何为吞吐量(throughput):JVM为垃圾收集专门准备了垃圾收集线程(GC thread),对于用户程序线程来说,只要GCthread处于活跃状态,那么就会与其抢占资源。吞吐量指的则是,在固定时间内,用户程序运行的比例
比如吞吐量99/100则表示,100ms中有99ms的时间再运行客户程序线程,只有1ms在执行GC
何为暂停时间(pasue time):如字面意义,指的是处理器需要进行STW的时间,即,程序需要完全停下,等待他执行GC的时间

而实际上,这两个标准的根本原因其实是由收集器收集时的线程模式决定的,那么线程模式的类型有哪些?

6.2串行、并行、并发

何为串行: 顾名思义,一个线程必须等待另一个线程执行完毕才可以继续执行
何为并行: 即多个线程同时执行,比如一个房间有两个门,A与B同时进入这个房间
何为并发: 即处理器以每个线程交替执行一段时间的方式实现两个程序同时执行的效果

6.3其他类型收集器讲解

serial&serial Old
串行,但实际上有着优秀的处理算法,其中serial在单CPU模式下,依然是新生代的垃圾回收首选,当然,由于GC过程全程STW,属于暂停时间较高在这里插入图片描述
parNew
只是serial的多线程版本,底层算法的实现并没有什么区别,在多CPU的情况下,可以提高一定的收集速度——需要注意的是,它虽然是并行收集器,但是他是自己和自己的线程并行而不是垃圾收集器线程与程序运行线程并行,本质上,仍然是串行的
在这里插入图片描述
parallel GC&parallel Old
在这里插入图片描述
本质上仍然需要进行STW以执行垃圾处理,但是调优了吞吐量相关的算法,被称为吞吐量优先算法,也就是在单位时间中,让算法程序的线程能获得最高的运行时间,但是由于收集期间全程STW,使得其不适合作为以高速的用户响应为需求的服务器的首要GC模式,相应的,非常适合那种专注于后台计算,不需要大量的用户交互的项目,如云计算服务器等等

CMS
CMS针对暂停时间特化了算法——他将可以不进行STW的一切行为尽可能的优化为与程序线程并发进行,这使得程序暂停时间大大降低——但是并发的本质是,cpu将不同的线程片段交错运行达成同时运行的效果,也就是单位时间内CMS的运行时间相对较长,因此CMS的吞吐量比较低
在这里插入图片描述
G1
G1比起其他类型的收集器,从堆内存结构开始全部都有所改革,他是第一个同时司职全部堆内存的收集器,因此有许多收集器没有的特殊特性,再此,以多个方面进行讲解
1.内存分配方式
首先,G1的堆内存虽然仍然保留了新生代老年代的定义,但是本质上堆内存已经没有物理隔离,是一块完整的内存
在这里插入图片描述
如图所示,堆内存被分割为了多个名为范围(region)之中,每个Region都有独一无二的分代类型——一个region要么是young的要么是old的
每个region都被分为存放了东西和未存放东西的两部分,这两个部分的界限被称为top,在设计逻辑上,和指针的出入栈相同,存放对象只需要调高top的值,这使得对象的存入速度大大提升

2.和CMS相比的优势:

2.1.G1一人管理整个内存区域
没有必须绑定的ParNew这个累赘的限制
2.2.吞吐量优势
G1和CMS一样,进行了最短暂停时间的特化,有并发标记和删除的能力,同时,由于内存分块的特性,G1可以计算出哪些内存Region的清理优先级最高因而使用筛选删除——G1将会根据使用者设置的吞吐量需求,按优先级对部分区域进行清理,从而达成降低吞吐量的效果
2.3.碎片管理优势
G1的清理算法,从整体来看类似标记整理算法,但是具体实现其实是两个region独立使用复制算法的结果,这导致G1在能够保证清理速度的同时不会产生内存碎片

3.运行模式
在这里插入图片描述
可以看出,整个清理过程和CMS的逻辑十分类似,然而由于筛选删除的特性使得吞吐量能够得到不小的提高
由于筛选删除是根据用户的配置将Region按照回收价值按顺删除,所以筛选删除经常会选择STW以提高删除效率

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值