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

小结

相关推荐

  1. jvm垃圾回收

    2024-04-27 10:48:01       43 阅读
  2. JVM各种垃圾回收(GC)

    2024-04-27 10:48:01       23 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-27 10:48:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-27 10:48:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-27 10:48:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-27 10:48:01       20 阅读

热门阅读

  1. vulnhub——DC:7

    2024-04-27 10:48:01       12 阅读
  2. 三生随记——阴影之下

    2024-04-27 10:48:01       14 阅读
  3. 【uni-app】uni-app官方自带图标的使用方法

    2024-04-27 10:48:01       13 阅读
  4. 单例模式

    2024-04-27 10:48:01       12 阅读
  5. electron实现静默打印(各种踩坑解决)

    2024-04-27 10:48:01       14 阅读
  6. Springboot实现串口(RS232)控制【最新】

    2024-04-27 10:48:01       12 阅读
  7. 独孤思维:知行合一的副业魅力

    2024-04-27 10:48:01       12 阅读