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,暂停时间较久(出现概率很低)。

小结

相关推荐
小飞猪Jay27 分钟前
C++面试速通宝典——13
jvm·c++·面试
Ray Wang14 小时前
3.JVM
jvm
java6666688881 天前
Java中的对象生命周期管理:从Spring Bean到JVM对象的深度解析
java·jvm·spring
生产队队长1 天前
JVM(HotSpot):字符串常量池(StringTable)
jvm
Yuan_o_1 天前
JVM(Java Virtual Machine) 详解
jvm
派大星-?1 天前
JVM内存回收机制
jvm
G丶AEOM2 天前
Hotspot是什么?
jvm·hotspot
太阳伞下的阿呆2 天前
Java内存布局
jvm·内存对齐·内存布局·压缩指针
Tech Synapse2 天前
Java如何解决同时出库入库订单号自动获取问题
java·jvm·oracle
hiyo5852 天前
C#类的概念
java·jvm·c#