GVM垃圾收集器

Serial收集器(新生代)

        Serial(串行)收集器是最基本、历史最悠久的垃圾收集器,采用“标记-复制”算法负责新生代的垃圾收集。它是Hotspot虚拟机运行在客户端模式下的默认新生代收集器。

        它是一个单线程收集器。它会使用一条垃圾收集线程去完成垃圾收集工作,并且它在进行垃圾收集工作的时候,必须暂停其他所有的工作线程(“Stop The World”),知道收集结束。

        这样的设计带来的好处就是:简单高效。对于内存资源受限的环境,它是所有收集器中额外内存消耗最小的收集器。适合单核处理器或处理器核心数较少的环境,每次收集几十MB甚至一两百MB的新生代内存,垃圾收集的停顿时间完全可以控制在十几毫秒或几十毫秒,最多一百多毫秒。

Serial Old收集器(老年代)

        Serial Old收集器同样是一个单线程收集器,采用“标记-整理”算法负责老年代的垃圾收集,主要用于客户端模式下的HotSpot虚拟机使用。

        如果在服务器端使用,它主要有两种用途:

  1. 在JDK5及以前版本,与Parallel Scavenge收集器搭配使用
  2. 作为CMS收集器发生失败时的后备预案

ParNew收集器(新生代)

        ParNew收集器是一个多线程的垃圾收集器。它是运行在Server模式下的虚拟机首要选择,可以与Serial Old,CMS垃圾收集器一起搭配工作,采用“标记-复制”算法。

Parallel Scavenge收集器(新生代)

        Parallel Scavenge收集器也是一款新生代收集器,使用“标记-复制”算法实现的多线程收集器

        Parallel Scavenge收集器与其他收集器的目标不同,CMS等其他收集器目标是尽可能缩短垃圾收集时用户线程的停顿时间。但是 Parallel Scavenge 收集器的目标则是达到一个可控制的吞吐量。所谓吞吐量就是处理器用于运行用户代码的时间与处理器总消耗时间的比值。

         如果虚拟机完成某个任务,用户代码加上垃圾收集总共耗费了 199 分钟,其中垃圾收集花掉 1 分钟,那吞吐量就是 99% 。停顿时间越短,就越适合需要与用户交互或需要保证服务响应质量的程序,良好的响应速度能提升用户体验:而高吞吐量则可以最高效率地利用处理器资源,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的分析任务。

Parallel Old收集器(老年代)        

        Parallel old 收集器是一个多线程的垃圾收集器,使用“标记-整理”算法是 Parallel scavenge 收集器的老年代版本。

        在注重吞吐量或者处理器资源较为稀缺的应用场景,都可以优先考虑Parallel scavenge 收集器 + Parallel old 收集器这个收集器组合。

        这个收集器是直到 JDK6 时才开始提供的,在此之前,新生代的 Parallel scavenge 收集器一直处于相当尴尬的状态,原因是如果新生代选择了 Parallel scavenge收集器,老年代除了 serial old 收集器以外别无选择,其他表现良好的老年代收集器,如 CMS 无法与它配合工作。由于老年代 serial old 收集器在服务端应用性能上的“拖累”,使用 Parallel scavenge 收集器也未必能在整体上获得吞叶量最大化的效果。同样,由于单线程的老年代收集中无法充分利用服务器多处理器的并行处理能力在老年代内存空间很大而且硬件规格比较高级的运行环境中,这种组合的总吞叶量甚至不一定比 ParNew 加 CMs 的组合来得优秀。

CMS收集器(老年代)

        CMS ( concurrent Mark Sweep ) 收集器是一种以获取最短回收停顿时间为目标的收集器,基于“标记-清除”算法实现,是 HotSpot 虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程 (基本上) 同时工作。

        目前很大一部分的 java 应用集中在互联网站点或者基于浏览器的 B/s 架构的服务器务端上,这类应用通常都会较为关注服务的响应速度,希望系统停顿时间尽可能短,以给用户带来自好的交互体验。所以, CMS 收集器非常符合这类应用的收集场景。

工作流程:

整个过程包括四个步骤:
1.初始标记 (CMS initial mark) : 标记 下 GC Roots能直接关联到的对象,速度很快;
2.并发标记 (CMS concurrent mark): 从 C Roots 的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长,但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行;
3.重新标记 (CMS remark): 重新标记阶段,是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间长,远远比并发标记阶段时间短;
4.并发清除 (CMS concurrent sweep) : 清理删除掉标记阶段判断的已经死亡的对象,由于不需要移动存活对象,所以这个阶段也是可以与用户线程同时并发的

优点和缺点

主要优点: 并发收集、低停顿
主要缺点:

  • 影响用户线程的执行效率:并发标记并发清除时,是和用户线程一起运行的,收集过程中肯定占用了用户程序的 CPU 资源。 CMS 默认启动的回收线程数是 (CPU数量+3)/4 ,当 CPU 数量在 4 个以上时,垃圾回收线程占用不少于 25% 的 CPU资源,势必影响用户线程的执,行效率。
  • 无法处理浮动垃圾:在并发清除阶段,用户线程并没有停止,所以还会继续产生新的垃圾,只能等待下一次收集时才能进行回收,这部分垃圾被称为“浮动垃圾”。
  • 产生大量空间碎片: 因为CMS收集器是基于“标记-清除”算法实现的,所以在进行大量的垃圾回收时,会产生很多不连续的内存空间。这是使用“标记-清除”算法都会有的缺点。 

        由于垃圾收集阶段用户线程还需要持续运行,所以需要预留足够的内存空间提供给用户线程使用,因此 CMS 收集器不能像其它收集器那样等到老年代几乎完全被填满了再进行收集。

  • 在 JDK6 的默认设置中, CMS 收集器的启动值为 92% ,代表老年代使用了 92%的空间后,就会启动 CMS 收集器
  • 如果 CMS 运行期间,无法满足程序分配新对象的需要,就会出现一次“并发失败”,这时候虚拟机将临时启动 serial old 收集器进行老年代的垃圾收集。

G1收集器(老年代)

什么是G1 垃圾收集器

        G1 ( Garbage-First )是一款面向服务器的垃圾收集器,主要针对配备多颗处理器、大容量内存的机器。它不再严格按照分代思想进行垃圾回收。 G1 采用局部性收集的设计思路和基于 Region 的内存布局形式。

G1 垃圾收集器的结构

        G1 采用局部性收集的思想,对于堆空间的划分,采用 Region 为单位的内存划分方式:

        G1 垃圾回收器把堆划分成 2048 个大小相同的独立区域 ( Region ) ,每个 Region 的大小取值范围是 1MB-32MB,且应为 2的N 次幕,即 1MB,2MB ,4MB8MB ,16MB,32MB。

        每个 Region 都会代表某一种角色,H 、s 、E、0。E 代表 Eden 区,s 代表 Survivor 区, H 代表的是 Humongous  G1 用来分配大对象的区域,对于 Humongous 也分配不下的超大对象,会分配在连续的 N 个 Humongous中),剩余的深蓝色代表的是 old 区,灰色的代表的是空闲的 region。

        这种思想上的转变和设计,使得G1可以面向堆内存任何部分来组成回收集来进行回收,衡量标准不再是它属于哪个分代,而是哪块内存存放的垃圾最多,回收收益最大,这就是G1收集器的 Mixed GC模式,即混合GC模式。

G1 垃圾收集器工作流程

初始标记( Initial Marking ): 这个阶段仅仅只是标记GC Roots能直接关联到的对象,这阶段需要停顿线程,但是耗时很短.

并发标记( Concurrent Marking ): 从GC Roots开始对堆的对象进行可达性分析,递归扫描整个堆里的对象图,找出存活的对象,这阶段耗时较长,但是可以与用户程序并发执行。

最终标记( Final Marking ): 对用户线程做另一个短暂的暂停,用于处理并发阶段结束后遗留记录。

筛选回收( Live Data counting and Evacuation ): 负责更新 Region 的统计数据,对各个 Region 的回收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划。可以自由选择多个 Region 来构成会收集,然后把回收的那部分 Region 中的存活对象==>复制==>到空的Region中,最后对那些 Region 进行清空。

G1 垃圾收集器的特点

        并行与并发: G1 能充分利用 CPU 、多核环境下的硬件优势,使用多个 CPU ( CPU 或者 CPU 核心) 来缩短 stop-The-world 停顿时间。部分其他收集器原本需要停顿 Java 线程执行的 GC 动作, G1 收集器仍然可以通过并发的方式让 java 程序继续执行。

        分代收集: 虽然G1 可以不需要其他收集器配合就能独立管理整个 GC 堆,但是还是保留了分代的概念。但它能够采用不同方式去处理新创建的对象和已存活一段时间、熬过多次 Gc 的日对象来获取更好的收集效果。

        空间整合: G1 从整体来看是基于“标记-整理”算法实现的收集器,从局部 (两个 Region 之间) 上来看是基于“标记-复制”算法实现的。这意味着 G1 运行期间不会产生内存空间碎片,收集后能提供规整的可用内存。此特性有利于程序长时间运行,分配大对象时不会因为无法找到连续内存空间而提前触发下一次 GC 。

        用户指定期望停顿: 允许用户指定期望的停顿时间是 G1 收集器很强大的一个功能,设置不同的期望停顿时间,可以让 G1 在不同的场景下取得吞吐量和延迟之间的最佳平衡。 G1 的默认停顿目标为 200 毫秒,一般来说,设置为一百毫秒至两百毫秒这个区间都很正常。如果期望停顿时间设置过短,会导致由于停顿目标时间太短,导致每次筛选出来的回收集只占堆内存很小的一部分,收集器的收集速度会跟不上分配速度,导致垃圾慢慢堆积。

G1 垃圾收集器与CMS垃圾收集器的区别

        算法不同: CMS 采用“标记-清除”容易产生内存碎片,执行若干次 GC 后进行 1 次碎片整理。 G1 从整体来看是基于“标记-整理”算法实现的收集器,从局部(两个 Region 之间) 上来看是基于“标记-复制”算法实现。意味着G1垃圾收集器不会产生内存空间碎片,垃圾收集完成后,能提供规整的可用内存,不会导致因为大对象分配内存时无法找到连续内存空间而提前触发垃圾收集。

        场景不同: 小内存应用上 CMS 的表现大概率优于 1 而在大内存应用中, G1 则能发挥优势。大小内存的参考值分水岭大概在 6GB-8GB

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C桑(Cython)从入门到入土(2): np数组操作对比

C桑(Cython)从入门到入土 2. np数组操作对比 Node sc518 Copy has image data of type unsigned long long实际上, 👆🏻这个错误是我探索Cython的缘起… code1: Form: 更现代的方法是使用内存视图而不是指针: cdef np.uint32_t[:,:,::1] …

大模型学习产品,一个月顶一年 | 对话网易有道周枫

OpenAI CEO奥特曼曾表示:“AI女友只不过是一个美丽的陷阱,AI教育才是最应该去发力的一个领域。” 场景的确定性,是OpenAI等一众公司尤为重视教育领域的原因所在。教与学是教育场景中的核心,但再将两个字进行拆解,教学…

展望2024:9大要点把握PLM软件趋势,云PLM领导者Arena

2023年《质量强国建设纲要》(以下简称《纲要》)的推出,再次确定了中国要走上制造业高质量发展之路的决心。《纲要》指出要深入实施质量强国战略,加快传统制造业技术迭代和质量升级,推动工业品质量迈向中高端。当前&…

蓝桥杯基础知识3 memset()

蓝桥杯基础知识3 memset() #include <bits/stdc.h> using namespace std;int main(){int a[5]; //随机数for(int i 0;i < 5; i)cout << a[i] << \n;cout << \n;memset(a, 0, sizeof a); //0for(int i 0;i < 5; i)cout << a[i] << …

高德打车引入“红绿灯倒计时”能力,算力技术升级打车体验

打到的车还有多久能到&#xff1f;接驾车辆原地不动是什么原因&#xff1f;乘客在打车时&#xff0c;常常因为无法了解实时接驾路况&#xff0c;容易出现“等车焦虑”。 如今&#xff0c;高德打车已全面应用“红绿灯倒计时”能力&#xff0c;让乘客在等车时就能掌握接驾路况&am…

Qt QTableWidget表格控件

文章目录 1 属性和方法1.1 行列数目和行表头和列表头1.2 单元格1.3 隔行交替背景色1.4 选择模式和选择行为1.5 设置样式表 2 实例2.1 布局2.2 代码实现 QTableWidget是Qt中的表格控件。 1 属性和方法 QTableWidget有很多属性和方法&#xff0c;完整的可查看帮助文档。 在窗口…

时间序列预测 — VMD-LSTM实现单变量多步光伏预测(Tensorflow):单变量转为多变量预测多变量

专栏链接&#xff1a;https://blog.csdn.net/qq_41921826/category_12495091.html 专栏内容 所有文章提供源代码、数据集、效果可视化 文章多次上领域内容榜、每日必看榜单、全站综合热榜 时间序列预测存在的问题 现有的大量方法没有真正的预测未来值&#xff0c;只是用历史数据…

STM32L051使用HAL库操作实例(14)- ADC采集电压

目录 一、前言 二、ADC外设简要说明 三、STM32CubeMX配置&#xff08;本文使用的STM32CubeMX版本为6.1.2&#xff09; 1.MCU选型 2.时钟使能 3.外部时钟配置 4.串口配置 5.ADC引脚配置 6.配置STM32CubeMX生成工程文件 7.点击GENERATE CODE生成工程文件 四、工程源码 …

20240112让移远mini-PCIE接口的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通【DTS部分】

20240112让移远mini-PCIE接口的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通【DTS部分】 2024/1/12 16:20 https://blog.csdn.net/u010164190/article/details/79096345 [Android6.0][RK3399] PCIe 接口 4G模块 EC20 调试记录 https://blog.csdn.net/hnjztyx/artic…

vue3+ts+vite+elementPlus后台管理系统学习总结01

vue3tsviteelementPlus后台管理系统学习总结01 一&#xff1a;运行源代码一&#xff1a;按照博客一步步操作1.ts中引入path模块出错&#xff1a;Cannot find module path or its corresponding type declarations.2.安装最新版本的pnpm:3.配置自动导入时&#xff0c;遇到.eslin…

web网页首页布局

效果展示&#xff1a; html代码&#xff1a; <!doctype html> <html> <head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"> <meta name"viewport" content&qu…

CSS3简单运用过渡元素(transition)

CSS3过渡 概念&#xff1a;在CSS3中&#xff0c;我们可以使用transition属性将元素的某一个属性从“一个属性值”在指定的时间内平滑地过渡到“另一个属性值”&#xff0c;从而实现动画效果。 CSS3变形&#xff08;transform)呈现的仅仅是一个结果&#xff0c;而CSS过渡&…

AdaM: An Adaptive Fine-Grained Scheme for Distributed Metadata Management——泛读论文

ICPP 2019 Paper 分布式元数据论文汇总 问题 为了同时解决元数据局部性和元数据服务器的负载均衡。 现有方法缺陷 基于哈希的方法&#xff1a;zFS [16]&#xff0c;CalvinFS [21]&#xff0c;DROP [24]&#xff0c;AngleCut [8] 静态子树划分&#xff1a;HDFS [6], NFS [14…

2024年【电工(初级)】最新解析及电工(初级)模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电工&#xff08;初级&#xff09;最新解析根据新电工&#xff08;初级&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将电工&#xff08;初级&#xff09;模拟考试试题进行汇编&#xff0c;组成一套电…

Java十大经典算法——贪心算法

算法概念&#xff1a; 贪婪算法(贪心算法)是指在对问题进行求解时&#xff0c;在每一步选择中都采取最好或者最优(即最有利)的选择&#xff0c;从而希望能够导致结果是最好或者最优的算法&#xff1b;贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解)&#xff0c;但…

世微AP5125 输入14-80V 输出12V5A LED灯降压恒流电源驱动方案 SOT23-6

这是一款60WLED驱动方案,线路图BOM表如下 ​ 祥单表&#xff1a; 实物图&#xff1a; 产品描述 AP5125 是一款外围电路简单的 Buck 型平均电流检测模式的 LED 恒流驱动器&#xff0c;适用于 8-100V 电压范围的非隔离式大功率恒流 LED 驱动领域。芯片采用固定频率 140kHz 的 …

Springboot3+EasyExcel由浅入深

环境介绍 技术栈 springboot3easyexcel 软件 版本 IDEA IntelliJ IDEA 2022.2.1 JDK 17 Spring Boot 3 EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 他能让你在不用考虑性能、内存的等因素的情况下&#xff0c;快速完成Excel的读、…

Mr_HJ / form-generator项目文档学习与记录(续2)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/n…

vue3打包后页面空白解决方法

vue3打包后页面空白解决方法 问题解决方法 问题 最近写一个小项目 没有打包的时候一切正常 技术栈用的vue3 vite 我用的是npm创建的项目 npm init vuelatest问题一 &#xff1a;打包后页面空白&#xff0c;什么都没有 问题二&#xff1a;刷新页面后找不到资源 把url的inde…

(超详细)5-YOLOV5改进-添加A2Attention注意力机制

1、在yolov5/models下面新建一个A2Attention.py文件&#xff0c;在里面放入下面的代码 代码如下&#xff1a; import numpy as np import torch from torch import nn from torch.nn import init from torch.nn import functional as Fclass DoubleAttention(nn.Module):def …