垃圾回收器

比眉伴天荒 2023-10-04 20:49 170阅读 0赞

俗话说“没有那金刚钻,就别揽瓷器活”,再好的理论实现总要有对应的工具才能实现,今天我们来讲解垃圾回收,如果说垃圾回收算法是内存回收的方法论,那么收集器就是垃圾回收的实践者。

  1. 垃圾回收的分类































线程数

单线程(串行)垃圾回收器

只有一个线程进行垃圾回收,适用于小型的使用场景,垃圾回收时,其他用户线程会暂停








多线程垃圾回收器(parallel)

多线程垃圾回收器内部提供多个线程进行垃圾回收,在多cpu情况下大大提升垃圾回收效率,但同样也会暂停其他用户线程








工作模式

独占式

垃圾回收线程执行时,其他线程暂停

并发式

垃圾回收线程可以和用户线程同时执行

工作的内存空间

年轻代垃圾回收器

老年代垃圾回收器

  1. 垃圾回收器的性能指标

    • 暂停时间:执行垃圾收集时,程序的工作线程被暂时停止

    • 吞吐量:运行用户代码的时间占总运行时间的比例(总运行时间:程序的运行时间+内存回收的时间)

    • 回收速度:一个对象从诞生到被回收锁经历的时间

    • 占用内存大小:java堆区所占的内存大小

3.CMS回收器

CMS(Concurrent Mark Sweep,并发标记清除)收集器是以获取最短回收停顿时间为目标的收集器

垃圾回收过程

  1. 初始标记:独占式的暂停用户线程

  2. 并发标记:垃圾回收线程与用户线程并发(同时)执行

  3. 重新标记:独占式的暂停用户线程

  4. 并发清除:垃圾回收线程与用户线程并发(同时)执行,进行垃圾对象的清除

优点:可以做到并发收集

缺点:使用标记清除算法,会产生内存碎片,并发执行影响到用户线程,无法处理浮动垃圾

4.三色标记

CMS在并发执行的过程中,标记垃圾对象时有不确定性,所以在标记时,将对象分为3种颜色

黑色:例如GCRoots确定是存活对象

灰色:在黑色对象中关联的对象,其中还有未扫描的,之后还需要再次进行扫描

白色:与黑色,灰色无关联的,垃圾算法不可达的对象

标记过程

  1. 先确定GCRoots,把GCRoots标记为黑色

  2. 与GCRoots关联,关联的对象标记为灰色

  3. 在此遍历灰色,灰色变为黑色,灰色下面有关联的对象,关联的对象变为灰色

  4. 最终保留黑色、灰色,回收白色对象

在三色标记时,有可能会出现漏标错标的问题

漏标

445afec2f5fcd3eadd0acae61a30458a.png

由于灰色被赋予null值之后,与黑色的连接中断,在本轮GC不会回收灰色以及白色对象,算浮动垃圾的一部分

错标:

9173f04354c41bf1232e15a84af906a7.png

B到C的引用被切断,A到C的引用被建立
此时GC线程继续工作,由于B不在引用C了,尽管A又引用了C,但是A已经是黑色了,等下次GC并不会对A进行扫描遍历,进而D会标记为白色,最后被当成垃圾回收

错标的出现满足下列情况才能发生?

  1. 原始快照(灰色指向白色的引用全部断开)

  2. 增量更新(黑色指向白色的引用被建立)

5.G1(Garbage First)回收器

G1是一款面向服务端应用的垃圾收集器,在延迟可控的情况下获得尽可能高的吞吐量

ea628eddfe05bdc57407d8d6b09a4e68.png

G1把堆内存分割成为很多不相关的区域(物理上不连续的逻辑上连续的),有计划地避免在整个java堆中进行全区域的垃圾收集,在后台维护一个优先列表,每次根据允许的时间,优先回收价值最大的Region

36f6ab34f385a54a822fab513e9c58a5.png

  1. 初始标记:标记出GCRoots直接关联对象,这个阶段速度较快,需要停止用户线程,单线程执行

  2. 并发标记:从GCRoots开始对堆内的对象进行可达性分析,找出存活对象,这个阶段耗时较长,但可以和用户线程并发执行

  3. 最终标记:修正在并发标记阶段引用户程序执行而产生变动的标记记录

  4. 筛选回收:对各个Region进行了重新排序,用第一时间去清理垃圾最多的区块(用最少的时间去回收包含垃圾最多的区域)

发表评论

表情:
评论列表 (有 0 条评论,170人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JVM 垃圾回收

    GC分类与性能指标 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了

    相关 垃圾回收

    俗话说“没有那金刚钻,就别揽瓷器活”,再好的理论实现总要有对应的工具才能实现,今天我们来讲解垃圾回收,如果说垃圾回收算法是内存回收的方法论,那么收集器就是垃圾回收的实践者。

    相关 JVM 垃圾回收

    分代收集: 根据各个年代的特点选取不同的垃圾回收算法 新生代使用复制算法 老年代使用标记-整理或者标记-清除算法 jps -v 显示当前使用的垃圾回收