学习笔记JVM篇(四)

垃圾回收器

说完垃圾回收算法接下来就需要对应的垃圾回收器去回垃圾回收器。接下来介绍几种垃圾回收器

1、Serial

串行回收器,是单线程版本,暂停所有的应用。在单CPU的情况下效率是很高的,因为不涉及线程的上下文切换。适用于小型程序和客户端应用,不太适合Java Web。Serial使用的垃圾回收算法是,新生代:复制算法;老年代:标记整理

2、ParNew:

作用于新生代的,在Serial的基础上改为了多线程版本,使用多个线程进行垃圾回收。适用于大型应用和Web 程序,在单核CPU的效率比Serial效率低,因为涉及到了线程的上下文切换。

3、Parallel

全称 Parallel Scavenge是一种多线程的收集器,和ParNew收集器类似,是一个新生代的

4、Parallel Old

是Parallel的老年代版本

5、CMS(Concurrent Mark Sweep)

是一种并发的垃圾回收器,用的是标记-清除法。(JDK11之后被废弃了),用于老年代的垃圾回收。停顿时间比较短。过程如下

  1. 初始标记:标记与GCRoot直接关联的的对象(注意是直接关联,间接的不会被标记),此时会触发STW。
  2. 并发标记:与用户线程并发,这里是从与GCRoot直接关联的对象开始扫描,而不是从GCRoot开始。
  3. 重新标记:会触发STW,因为第二步可能会导致一些对象错标或者漏标。
  4. 并发清除:与用户线程并发
6、新一代垃圾回收器G1

全称Garbage First,在不同区域分配垃圾回收。G1垃圾回收器保留了分代思想,但是取消了新生代和老年代的物理划分,把内存分为多个区域(Region),区域中的逻辑包含了新生代和老年代。区域是动态变化的,原先是老年代的区域,在之后可能会变成新生代,实现更精细化的内存划分。

G1整体采用标记整理算法,局部采用标记复制算法,所以不会产生内存碎片。G1垃圾回收器会把内存分为大约2048个区域(Region)。

同时新增了名为Humongous的内存区域用于存储大对象,如果一个H区域装不下则G1会查询连续的H区域去存储该对象,为了找到连续的空间可能会触发Full GC。

G1提供了三种模式的垃圾回收模式:

  1. Young GC:与其它垃圾回收器不同,其他垃圾回收器是当Eden区满了触发Young GC 而G1则是会预测Eden区回收要多久,如果接近参数配置的时间则会触发Young GC。回收的算法是采用标记复制算法。
  2. Mix GC :混合GC,多数对象晋升到老年代后,为了避免内存耗尽会触发Full GC,回收整个Young Region和部分的Old Region。触发条件当老年代对象占比超过阈值(可配置)
  3. Full GC:对老年代进行垃圾回收,采用标记、清除、压缩相对来说比较耗时。

总结:在Yong GC和Mix GC模式下,G1会对每个Region存活对象进行统计。根据存活对象和闲置的Region数量动态的决定垃圾回收的区域和顺序。这种动态策略可以尽可能的减少Full GC。过程如下:

相关推荐
野犬寒鸦23 分钟前
从零起步学习并发编程 || 第七章:ThreadLocal深层解析及常见问题解决方案
java·服务器·开发语言·jvm·后端·学习
陈桴浮海25 分钟前
【Linux&Ansible】学习笔记合集二
linux·学习·ansible
xhbaitxl42 分钟前
算法学习day39-动态规划
学习·算法·动态规划
智者知已应修善业1 小时前
【洛谷P9975奶牛被病毒传染最少数量推导,导出多样例】2025-2-26
c语言·c++·经验分享·笔记·算法·推荐算法
ZH15455891311 小时前
Flutter for OpenHarmony Python学习助手实战:数据库操作与管理的实现
python·学习·flutter
Junlan271 小时前
Cursor使用入门及连接服务器方法(更新中)
服务器·人工智能·笔记
risc1234562 小时前
如何认识结构?结构 = 要素 + 关系 + 动态
笔记
试着2 小时前
【huawei】机考整理
学习·华为·面试·机试
風清掦2 小时前
【江科大STM32学习笔记-05】EXTI外部中断11
笔记·stm32·学习
Purple Coder2 小时前
基于CNN对YBCO超导块材孔隙研究
学习