jvm中的垃圾回收器

Jvm中的垃圾回收器

在jvm中,实现了多种垃圾收集器,

包括: 1.串行垃圾收集器 2.并行垃圾收集器 3.CMS(并发)垃圾收集器 4.G1垃圾收集器

1.串行垃圾回收器

效率低,使用较少

2.并行垃圾回收器

3.并发垃圾回收器

主要针对老年代进行垃圾回收

说明:

1.初始标记时,就是采用可达性分析算法进行标记,此时会阻塞其他线程(阻塞时间很短,不会影响用户体验)此时,只标记了GC Roots和GC Roots直接关联的对象A

2.并发标记,此时,不会阻塞线程,会从A开始找到所有存活的对象:A、B、C、D、GC Roots。

3.重新标记,为什么这里还要重新标记一遍呢?这是因为当时并发标记的时候,其他线程还在执行,如果这期间,比如说:之前没有被引用的X,在此期间被A引用了,这里重新标记的时候,就会把X标记为存活对象

注:重新标记的时候,所有线程共同参与,就不会出现新的引用!

4.并发清理,其他线程照常执行。

小结

G1垃圾回收器

概述

1.Young Collection(年轻代垃圾回收)

说明:下图中 e代表eden区(伊甸园),s代表幸存者区,o代表老年代

初始时,所有区域都处于空闲状态

创建了一些对象,挑出一些空闲区域作为伊甸园区存储这些对象

G1会对eden区占比进行限制,比如说当eden区占百分之五的时候,触发垃圾回收。当伊甸园需要垃圾回收时,挑出一个空闲区域作为幸存区 ,用复制算法复制存活对象到幸存者区,其他区域的空间就会被释放,标记和释放的时候都需要暂停用户线程(stw)。

随着时间流逝,伊甸园的内存又有不足

将伊甸园以及之前幸存区中的存活对象 ,采用复制算法,复制到新的幸存区,其中较老对象晋升至老年代

2.Concurrent Mark (并发标记)

当老年代占用内存超过阈值(默认是45%)后,触发并发标记,标记老年代中存活的对象,这时无需暂停用户线程

并发标记之后,会有重新标记阶段解决漏标问题,此时需要暂停用户线程(由于之前已经标记过一次,因此此时就算要暂停所有线程,时间也非常短,不会影响用户体验)。

这些都完成后就知道了老年代有哪些存活对象,随后进入混合收集阶段。此时不会对所有老年代区域进行回收,因为如果一次回收所有的老年代垃圾,会导致暂停时间太长。这里我们可以设置一个预期暂停时间,比如暂停时间不超过多少毫秒。因此为了不超过预期暂停时间,不是一次把所有老年代垃圾回收。而是根据暂停时间目标优先回收价值高 (存活对象比例较少)的区域(这也是 Gabage First 名称的由来)。

3.Mixed Collection (混合垃圾回收)

由于并发标记阶段已经把要回收的老年代垃圾标记出来了。在此阶段,某些回收价值高的区域会和eden区、幸存者区的垃圾一起被回收。

eden区和幸存者区还是存活对象还是会被复制到新的幸存者区,幸存者区中存活较久的对象、某些回收价值高的老年区中存活的对象,会被复制到新的老年区。

注意:混合垃圾回收可能要执行多次,才能把内存释放到阈值以下。

复制完成,内存得到释放。进入下一轮的新生代回收、并发标记、混合收集

注:其中H叫做巨型对象,如果对象非常大,会开辟一块连续的空间存储巨型对象

如果我们垃圾回收的速度小于分配新对象的速度,就会出现并发失败,会触发一次Full GC,暂停时间较久(出现概率很低)。

小结

相关推荐
WizLC18 小时前
【JAVA】JVM类加载器知识笔记
java·jvm·笔记
CodeAmaz19 小时前
Java 垃圾回收(GC)算法详解
java·jvm·算法·垃圾回收算法
漫漫求21 小时前
Java内存模型【JMM】、JVM内存模型
java·开发语言·jvm
dddaidai1231 天前
深入JVM(三):JVM执行引擎
java·jvm
小羊学伽瓦1 天前
ThreadLocal
java·jvm·算法
脸大是真的好~1 天前
JVM面试题相关-中级
jvm
利刃大大1 天前
【JavaSE】十九、JVM运行流程 && 类加载Class Loading
java·开发语言·jvm
福尔摩斯张1 天前
Linux Kernel 设计思路与原理详解:从“一切皆文件“到模块化架构(超详细)
java·linux·运维·开发语言·jvm·c++·架构
deng-c-f1 天前
Linux C/C++ 学习日记(51):内存池
jvm·学习
没有bug.的程序员1 天前
SOA、微服务、分布式系统的区别与联系
java·jvm·微服务·架构·wpf·日志·gc