GC垃圾回收器

news2024/12/26 0:41:23

分代收集器

新生代回收器

Serial:复制算法 | 单线程 | 适合内存不大的场景

ParNew:复制算法 | 多线程 | Serial收集器多线程版本

Parallel Scavenge:复制算法 | 多线程 | 类ParNew,更关注吞吐量

老年代回收器

Serial Old:标记整理算法 | 单线程

Parallel Old:标记整理算法 | 多线程 | Parallel Scavenge收集器的老年代版本

CMS:标记清除算法 | 多线程 | 尽可能的缩短垃圾收集时用户线程停止时,关注延迟

执行阶段:

  1. 初始标记(STW):只标记GC Roots的直接关联的对象,因为只有一层对象所以STW时间很短。
  2. 并发标记:从GC Roots对象直接关联的对象开始遍历整个对象图,与用户线程并发执行。
  3. 重新标记(STW):由于并发标记是与用户线程并发执行的,那么要修正并发标记期间的已被标记但是又被用户修改的这部分对象。相比初始标记阶段,STW时间会相对长一些。
  4. 并发清除:因为应用的标记清除算法,可以并发执行清理的操作。(若是标记清理算法,会涉及对象的位置迁移,那么并发执行会出现问题)

缺点:

  1. 内存碎片:因为应用的是标记清除算法
  2. 无法处理浮动垃圾:浮动垃圾就是并发标记阶段原可被关联的引用链上的对象被用户线程释放(如obj = null),导致原本不需回收的对象变成了垃圾对象,这些对象称为浮动垃圾,需要在下一次GC时清理
  3. Concurrent Mode Failure:当并发清除阶段时老年代内存不足,导致无法存储新的对象,那么就会发生Concurrent Mode Failure。会导致CMS退化为Serial Old,停止所有的用户线程,进行一次完整的单线程垃圾回收。

不分代收集器

G1:标记复制算法 | 多线程 | 适合内存较大,低延迟的场景。Jdk1.9的默认GC。将堆内存划分为定量的Region,GC时预估每个Region的可回收价值(可以回收对象的大小与回收等评判条件),尽量把垃圾回收造成的程序卡顿STW控制在指定的时间范围内,在有限的时间内回收更多的对象。

G1垃圾回收器下的堆内存模型

在这里插入图片描述

  1. Humongous Region:对象的大小超过了一个Region大小的50%,即认为是大对象,会被存放在humongous region中。若对象过大,可能会跨Region存储。在Mixed GC时,也会回收大对象Region。

  2. 逻辑分代,物理分区,Region数量最多为2048个

Minor GC(新生代回收)
  1. 新生代回收:Eden、Survivor Region
  2. 触发条件:新生代的Region(Eden、Survivor Region)占有60%的堆内存。
  3. 应用算法:标记复制,会STW。
  4. 新生代对象晋升老年代的条件:
    1. 对象年龄超过15。
    2. 存活对象大小超过60%的Survivor,会将age最大的对象晋升到老年代,即使age并没有超过15。
Mixed GC(混合回收)
  1. 混合回收:新生代+部分老年代+大对象(Eden、Survivor、Old、Humongous Region)一起混合回收。
  2. 触发条件:老年代的Region(Old Region)占有45%的堆内存。
  3. 回收算法:标记复制,会SWT。
  4. 回收执行阶段(类似CMS):
    1. 初始标记(STW):只标记GC Roots的直接关联的对象,因为只有一层对象所以STW时间很短。
    2. 并发标记:从GC Roots对象直接关联的对象开始遍历整个对象图,与用户线程并发执行。
    3. 重新标记(STW):由于并发标记是与用户线程并发执行的,那么要修正并发标记期间的已被标记但是又被用户修改的这部分对象。相比初始标记阶段,STW时间会相对长一些。
    4. 执行回收(STW):涉及对象的迁移,需要STW。在这个阶段,为了减少停顿时间可以将一次回收过程分为多次执。若在回收过程中对象分配过快,导致老年代内存填满,会退化为Seril Old单线程回收, 这个过程的时间与内存大小成正比的。期间会STW。

优点:

  1. GC周期短,低停顿:G1的思想就是持续的部分回收,每次都是清理垃圾集中的Region,不会全量回收,那么就不会像Serial Old 或 Parallel Old一样,在堆内存过大时,长时间STW阻塞。每次STW默认最多200ms。也是Mixed GC回收部分老年代Region的原因。
  2. 停顿时间可预测,我们可以通过参数来设置一次垃圾回收的时长。
  3. 更好的支持大内存。

三色标记算法

在这里插入图片描述

GC线程在打标B时,用户线程执行了对象属性的写操作,结果为上图的右部分。由于A对象为黑色,不会再被GC线程处理,又被改为不被B引用,那么C对象会被认为垃圾对象。但实际上却被A对象实际引用了,不应该被回收。对于这种漏标的情况,不同的垃圾回收器有不同的解决方式。基本都是基于读写屏障的方式。

读写屏障

var cField = B.c // 读
B.c = null // 写
A.c = C // 写

以写屏障为例,底层大概是这样的(类似AOP)

void field_store(Object* obj,  Object new_fieldValue) {  
  pre_field_store(new_fieldValue); // 写前操作   
  *obj = new_fieldValue;  
  post_field_store(new_fieldValue); // 写后操作
}

CMS的处理方式

写屏障 + Incremental Update(增量更新)

若执行A.c = C,即对象的成员属性被改变,由于A是黑色,将C作为一个灰色对象放入remark_set中,在remakr阶段处理该集合中的对象即可。底层大概是这样的:

void post_field_store(Object new_fieldValue) {
   if (!mark(new_fieldValue)) {
      remakr_set.add(new_fieldValue); // 新值记录到remakr_set中
   }
}

G1的处理方式

写屏障 + Snapshot At The Beginning(SATB快照)

若执行B.c = null,即对象的成员属性被改变,将修改前的对象C作为一个灰色对象放入remark_set中,在remakr阶段处理该集合中的对象即可。底层大概是这样的:

void pre_field_store(Object* field) {    
  remakr_set.add(* field); // 旧值记录到remakr_set中
}

(持续补充)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/87051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

postgresql文件结构

一、控制文件 pg_controldata $PGDATA 二、数据文件 pg中,每个索引、每个表都是一个单独的文件,pg中称为page(也称为段),默认是每个大于1G的page会被分割。例如某个表有200g的大小,那么会被分割为200个文件存储 sel…

Gateway限流的使用

目录 1. 限流的使用场景 2. gateway限流实现 2.1 前提: 2.2 导入依赖包 2.3 在项目配置文件中配置redis​编辑 2.4 开发限流需要的Bean​编辑 2.5 为服务配置限流参数 2.6 压力测试 3. 熔断 3.1 熔断的使用场景 1. 限流的使用场景 为什么限流 限流就是限制…

web网页设计期末课程大作业 基于HTML+CSS+JavaScript制作八大菜系介绍舌尖上的美食5页

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

4、Metasploit系列----未知目标测试

靶机Metasploitable2:192.168.11.105 攻击机kail:192.168.11.106 一、创建工作空间 显示数据库未连接:使用msfdb init对数据进行初始化:db_status显示数据库已连接。使用命令workspace -a 192.168.11.105创建目标工作空间。二、信…

Spring Batch 批处理-作业参数校验

引言 接着上篇:Spring Batch 批处理-作业参数设置与获取,了解作业参数设置与获取后,本篇就来了解一下Spirng Batch 作业参数的校验。 作业参数校验 当外部传入的参数进入步骤处理时,我们需要确保参数符合期望。比如&#xff1a…

前端实现电子签名(web、移动端)通用

前言 在现在的时代发展中,从以前的手写签名,逐渐衍生出了电子签名。电子签名和纸质手写签名一样具有法律效应。电子签名目前主要还是在需要个人确认的产品环节和司法类相关的产品上较多。 举个常用的例子,大家都用过钉钉,钉钉上…

对于双欧拉角(正反欧拉角)的一些理解和思考

文章目录一、正反欧拉角定义二、相关文献阐述三、对正反欧拉角的思考四、参考代码五、参考文献最近看到有人讨论“双欧拉角”或者“正反欧拉角”的问题,因为自己之前没听说过这个概念,为了避免无知,因此找了一些文献进行学习和理解。不过基于…

mysql优化,SELECT语句创建理想索引

思考索引的问题: 1.为什么主键索引比非主键索引快? 2.为什么sql使用like关键字 “%XXX%”无法走索引,而“XXX%”可以? 3.为什么有索引的字段,数据量大了后,增删改会很慢? 一. 了解数据库索引的必…

ADI Blackfin DSP处理器-BF533的开发详解45:图像处理专题-ThresholdData (图像阈值分割处理)(含源码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了图像阈值分割处理,代码运行时,会通过文件系统打开工程文件根目下" …/ImageView"路径中的…

Hive中数据类型介绍

文章目录数据库表分区表桶表数据库 当于关系数据库中的命名空间( namespace ),它的作用是将用户和数据库的应用,隔离到不同的数据库或者模式中 Hive中创建数据库等语法 表 Hive 的表在逻辑上由存储的数据和描述表格数据形式的相关元数据组成 元数据&a…

腾讯电竞广泛布局,难逃城市同质化怪圈?

文 | 螳螂观察 作者 | 张左文 2018年的那个夏天,那年的《英雄联盟》S赛,中国战队IG以3:0的绝对领先击败欧洲老牌冠军战队FNC,为LPL赛区拿下首个S赛冠军奖杯。 那是中国电竞史上浓墨重彩的一笔,也是腾讯电竞8年蛰伏后腾飞的开始…

​实验8 IP协议实验分析

注:原实验是在虚拟机中对主机使用ping命令,本文对www.bilibili.com使用ping命令来代替 IP分片 实验内容 wireshak开始捕获分组后,在cmd中输入ping www.bilibili.com -l 3000并执行 打开wireshak,在显示过滤器中输入icmp。得到…

展锐闪光灯 flash echo test测试

flash echo test测试 1.使用adb命令进入对应路径操作: adb root adb remount adb shell cd /sys/devices/virtual/misc/sprd_flash/ 输入对应命令 如上图示例:echo 0x0000(0000 0000 0000 0000) > test flash_idx: 表示…

Nacos配置管理之多环境共享

多环境配置共享 微服务启动时会从nacos读取多个配置文件: 1、[spring.application.name]-[spring.profiles.active].yaml 例如:userservice-dev.yaml 【服务名】-【环境】.yaml 2、 [spring.application.name].yaml 【服务名】.yaml 例如&#xff1a…

kube-proxy模式详解

kubernetes里kube-proxy支持三种模式,在v1.8之前我们使用的是iptables 以及 userspace两种模式,在kubernetes 1.8之后引入了ipvs模式,并且在v1.11中正式使用,其中iptables和ipvs都是内核态也就是基于netfilter,只有use…

仿写BitMap源码

bitmap的作用: 用来校验海量数字中某一个数字有没有出现过,海量数据中某一个数据有没有出现过 做一个长的比特数组,比特数组就会出现索引(0n),所有0n之间的数,比如123,就把所有比特数…

R语言画ROC曲线总结

在本文中,我描述了如何在CRAN中搜索用于绘制ROC曲线的包,并重点介绍了六个有用的包。 我使用pkgsearch来搜索CRAN并查看其中的内容。该package_search()函数将文本字符串作为输入,并使用基本的文本挖掘技术来搜索所有CRAN。 经过一番尝试和…

【Clickhouse】Clickhouse 精确去重计数性能测试

1.概述 4亿多的数据集上,去重计算出6千万整形数值, 非精确去重函数: uniq、 uniqHLL12、 uniqCombined 精确去重函数: uniqExact、 groupBitmap 结论: 整形值精确去重场景, groupBitmap 比 uniqExact至少快 2x+groupBitmap仅支持整形值去重, uniqExact支持任意类型去重…

中英文说明书丨艾美捷CD8α体内抗体介绍

艾美捷CD8α体内抗体英文说明: ICH1045 is up to 30% cheaper for academia & non-profits and up to 55% cheaper for industry than the equivalent product from Bio X Cell (BE0061). ICH1045UL is up to 31% cheaper for academia and up to 56% cheaper …

javaweb-Servlet的使用

xml设置 创建项目需要勾选下图的创建xml(适用于3.0以下版本,3.0以上的可以跳过使用下面的注解开发) 创建完项目后,找到web—WEB-INF—web.xml配置以下代码 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/…