JVM的故事——垃圾收集器

news2024/11/17 19:41:58

垃圾收集器

文章目录

  • 垃圾收集器
  • 一、serial收集器
  • 二、parnew收集器
  • 三、parallel scavenge收集器
  • 四、serial old收集器
  • 五、parallel old收集器
  • 六、CMS收集器
  • 七、Garbage First收集器
  • 八、收集器的权衡


一、serial收集器

新生代收集器,最基础的收集器,单线程。进行垃圾收集时必须暂停其他所有工作线程,stop the world
在这里插入图片描述

二、parnew收集器

新生代收集器,实质上是serial收集器的多线程版本。除了serial,只有它能和CMS收集器(老年代收集器)配合工作。随着处理器核心数越来越多,parnew比serial有着更好的性能。(但如果是单核心处理器,parnew一定不会比serial有更好的性能)

三、parallel scavenge收集器

新生代收集器,基于标记复制算法实现,并行收集,Parallel Scavenge的诸多特性从表面上看和ParNew非常相似。Parallel Scavenge收集器的特点是它的关注点与其他收集器不同,CMS等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Throughput)。

高吞吐量意味着最高效率的运行计算机资源,尽快完成计算任务,主要用在后台运算而不需要太多交互的分析任务。

四、serial old收集器

Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用标记-整理算法。和serial一样,它的主要作用也是曾经供客户端模式下hotspot虚拟机使用。在服务端,它可以和Parallel Scavenge配合使用,也可以作为CMS失败的备选方案。

五、parallel old收集器

Parallel Old是Parallel Scavenge收集器的老年代版本,支持多线程并发收集,基于标记-整理算法实现。在它 出现之前Parallel Scavenge不能与CMS搭配使用,所以只能与serial old搭配使用,这样的吞吐量不一定有parallel new 搭配CMS高。但是当parallel old出现之后,在注重 吞吐量或者处理器资源较为稀缺的场合,都可以优先考虑Parallel Scavenge加Parallel Old收集器这个组合。

六、CMS收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。CMS非常适合互联网网站或者基于浏览器的B/S系统,因为可以使响应时间尽可能短,提供给用户良好的交互体验。CMS是基于标记-整理算法实现的,它的过程有四个步骤:初始标记-并发标记-重新标记-并发清除
在这里插入图片描述

在初始标记和重新标记的过程都发生了”stop the world”。
初始标记时间很短,就是标记一下GC roots能直接关联到的对象。
并发标记时间比较长,是从GC roots直接关联到的对象开始遍历整个对象图。这个过程是和用户进程并发进行的。
重新标记是为了修正并发标记过程中因用户程序继续运行而导致标记发生变动的那一部分对象标记记录。这个过程会比初始标记长一点,但也远比并发标记时间短。
并发清除阶段就是清理删除掉标记阶段判断已经死亡的对象,由于不需要移动存活的对象,所以也可以和用户进程并发进行。CMS收集器是 HotSpot虚拟机追求低停顿的第一次成功尝试,但它还是有三个明显的缺点的:1、对处理器资源非常敏感。在并发阶段会占用一些性能,导致应用程序变慢。CMS默认启动的回收线程数是(处理器核心数量 +3)/4,当处理器的核心数小于4个时,CMS对用户程序的影响就会变得很大。为了应对这种情况,虚拟机提供了一种称为“增量式并发收集器”(Incremental Concurrent Mark Sweep/i-CMS)的CMS收集器变种,这会使垃圾收集的过程变长,用户程序受到的影响小一点。
2、然后,由于CMS收集器无法处理“浮动垃圾”(Floating Garbage),有可能出现“Con-current Mode Failure”失败进而导致另一次完全“Stop The World”的Full GC的产生。(浮动垃圾:在进行并发标记和并发清理时,用户程序产生的垃圾,但它们是出现在标记过程结束后,只能留到下一次垃圾收集再被清理。) 同样也是由于在垃圾收集阶段用户线程还需要持续运行,那就还需要预留足够内存空间提供给用户线程使用,因此CMS收集器不能像其他收集器那样等待到老年代几乎完全被填满了再进行收集,必须预留一部分空间供并发收集时的程序运作使用。在JDK 5的默认设置下,CMS收集器当老年代使用了68%的空间后就会被激活,到了JDK6这个值被提升到了92%,这可以降低回收的频率。但面对的风险是:如果CMS运行期间预留的内存不够用户程序运行,则会并发失败,虚拟机不得不停止用户程序,使用serial old进行老年代的垃圾回收。
3、CMS是一款基于“标记-清除”算法实现的收集器,这会导致内存中有大量的碎片空间。这就会出现往往老年代还有很多剩余空间,但却无法找到足够大的连续空间来分配当前对象,而不得不触发一次full GC。CMS收集器提供了一个-XX:+UseCMS-CompactAtFullCollection开关参数,来使CMS收集器不得不进行Full GC时开启内存碎片的合并整理过程,不过整理内存会移动存活对象不能进行并发,这又使用户停顿时间变长。因此虚拟机设计者们还提供了另外一个参数-XX:CMSFullGCsBefore- Compaction,这个参数是在CMS经历过若干次不用整理内存的full GC后,下次full GC前进行内存整理。

七、Garbage First收集器

Garbage First(简称G1)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。G1收集器是把Java堆划分为多个大小相等独立区域(region),每个region都可以根据需要去扮演新生代的survivor、eden或者老年代,收集器也根据它们扮演的不同角色采取不同的策略。
对于大小超过Region容量一半的对象,都被认为是大对象,它们都被放在特定的Humongous区域,一般把这个区域当成老年代来看待。
Region是单次回收的最小单位,后台维护一个优先级队列,存储着每个Region回收的价值,每次根据最大停顿时间去优先回收那些价值更高的Region。
在这里插入图片描述
G1收集器存在的一些技术难题:
1、将Java堆分成了多个Region,里面存在跨Region引用对象。可以使用记忆集避免全堆作为GC Roots扫描,不过每个Region都要维护自己的记忆集。
2、在并发标记阶段保证收集线程与用户线程互不干扰。CMS采用的是增量更新算法实现,G1 收集器则是通过原始快照(SATB)算法来实现的。G1收集器设计了两个名为TAMS(Top at Mark Start)的指针,在并发回收时新分配的对象都要在这两个指针之上,这也就不会标记到新分配的对象。当回收速度小于分配速度导致没有空间分配给新对象时,也会导致full GC
3、建立一个可靠的停顿预测模型。G1收集器是以衰减平均值来实现停顿预测模型的。衰减平均值更意味着最近的平均值,也就是越新的统计状态权重越高。

G1收集器的回收过程大致分为四个阶段:初始标记、并发标记、最终标记、筛选回收。
初始标记:标记一下GC Roots能直接关联到的对象,并修改TAMS指针的值
并发标记:递归扫描整个堆里的对象,找出需要进行回收的对象,这个过程耗时较长,但是可以和用户线程并发进行。还要重新处理SATB记录下在并发阶段有变动的对象引用。
最终标记:处理并发标记结束后仍遗留下来的少量SATB记录。
筛选回收:对各个Region的回收价值和成本进行分析,根据用户预期停顿时间制作回收计划。把决定回收的Region的存活对象复制到其他空的Region中,然后再把决定回收的Region全部清理。
在这里插入图片描述
一般来讲,小内存的应用CMS性能会优于G1,大内存的应用反之,这个Java堆容量堆平衡点大概在6-8GB之间。

八、收集器的权衡

一般进行收集器的选择时,主要考虑三方面:应用程序所注重的点是什么,运行应用的硬件情况,使用的JDK版本
比如是面向用户的B/S系统,那么低延迟就比较重要。如果有预算但没有调优经验,就适合商业技术支持的专有解决方案,可以使用C4收集器;如果没有足够预算就可以试试ZGC。
如果接手的是遗留系统,JDK版本比较低,就可以根据堆内存大小选择收集器,在4-6GB可以选择CMS,更大内存就可以选择G1。

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

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

相关文章

C#备份数据库文件

c#备份数据库文件完整代码 sqlServer 存储过程: USE [PSIDBase] GO /****** Object: StoredProcedure [dbo].[sp_BackupDB] Script Date: 2023/8/31 16:49:02 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GOALTER procedure [dbo].[sp_BackupDB]…

【Unity每日一记】WheelColider组件汽车游戏的关键

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

2023年腾讯云优惠券(代金券)领取方法整理汇总

腾讯云优惠券是腾讯云为了吸引用户而推出的一种优惠凭证,领券之后新购、续费、升级腾讯云的相关产品可以享受优惠,从而节省一点的费用,下面给大家分享腾讯云优惠券领取的几种方法。 一、腾讯云官网领券页面领取 腾讯云官网经常推出各种优惠活…

C#,数值计算——Midinf的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Midinf : Midpnt { public new double func(double x) { return funk.funk(1.0 / x) / (x * x); } public Midinf(UniVarRealValueFun funcc, double aa,…

内存四区(个人学习笔记黑马学习)

1、内存分区模型 C程序在执行时,将内存大方向划分为4个区域: 代码区:存放函数体的二进制代码,由操作系统进行管理的全局区:存放全局变量和静态变量以及常量栈区:编译器自动分配释放,存放函数的参数值,局部变量等 堆区:由程序员分配和释放,若程…

SpringBoot整合Freemaker结合Vue实现页面填写一键自动生成Redis的配置文件

🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:Sp…

DCMM数据能力成熟度评估模型--学习笔记

DCMM数据能力成熟度评估模型--学习笔记 1、DCMM简介、结构组成和成熟度评估等级划分1.1 DCMM简介1.2 DCMM结构组成1.3 DCMM关键过程域1.3.1、数据战略(指导方针)1.3.2、数据治理 (机制保障)1.3.3、数据架构 (施工图纸)1.3.4、数据…

WebRTC-Streamer交叉编译

WebRTC-Streamer交叉编译 flyfish 文章目录 WebRTC-Streamer交叉编译零、前言一、提前准备工作1 安装需要的工具2 可选的交叉编译工具3 默认执行python是python34 获取源码5 使用其他版本的方法 二、非交叉编译编译1 在 src目录执行 安装所需的依赖2 执行命令 三、 交叉编译1 …

【GAMES202】Real-Time Global Illumination(in 3D)—实时全局光照(3D空间)

一、SH for Glossy transport 1.Diffuse PRT回顾 上篇我们介绍了PRT,并以Diffuse的BRDF作为例子分析了预计算的部分,包括Lighting和Light transport,如上图所示。 包括我们还提到了SH,可以用SH的有限阶近似拟合球面函数&#xff…

【进阶篇】MySQL的SQL解析原理详解

文章目录 0. 前言1. SQL解析过程1. 词法分析2. 语法分析4. 语法分析树5. MySQL语法分析树生成过程6. 核心数据结构及其关系7. SQL解析的应用 2. 参考文档 0. 前言 你是否已经深入了解了MySQL中 SQL解析过程,以及解析过程中每个环节扮演的具体角色?你是否…

Windows SQLYog连接不上VMbox Ubuntu2204 的Mysql解决方法

Windows SQLYog连接不上VMbox Ubuntu2204 的Mysql解决方法 解决方法: 1、先检查以下mysql的端口状态 netstat -anp|grep mysql如果显示127.0.0.1:3306 则说明需要修改,若为: : :3306,则不用。 在**/etc/mysql/mysql.conf.d/mysqld.cnf**&am…

软件测试之黑盒测试、白盒测试分别是什么?有什么区别?

软件开发过程中,为了保证软件质量和稳定性,必须进行全面而细致的测试工作,而黑盒测试和白盒测试正是两种常用的测试方法。 一、黑盒测试 黑盒测试是一种基于软件外部功能的测试方法。测试人员对待测试的软件系统,就像一个黑匣子…

uniapp-秋云图表 ucharts echarts 对比与关系

科普: 秋云图表库,包含二种配置属性对应二种js配置文件。 一种是 :echarts.js,一种是 : ucharts。 二者的配置属性不一样! ucharts和echarts对比 ucharts和echarts都是用于数据可视化的开源JavaScript库,它…

【高危】Apache Airflow Spark Provider 反序列化漏洞 (CVE-2023-40195)

zhi.oscs1024.com​​​​​ 漏洞类型反序列化发现时间2023-08-29漏洞等级高危MPS编号MPS-qkdx-17bcCVE编号CVE-2023-40195漏洞影响广度广 漏洞危害 OSCS 描述Apache Airflow Spark Provider是Apache Airflow项目的一个插件,用于在Airflow中管理和调度Apache Spar…

自动化机器学习Auto-Sklearn安装和使用教程

安装和使用 Auto-Sklearn Auto-sklearn 提供了开箱即用的监督型自动机器学习。从名字可以看出,auto-sklearn 是基于机器学习库 scikit-learn 构建的,可为新的数据集自动搜索学习算法,并优化其超参数。因此,它将机器学习使用者从繁琐的任务中解放出来,使其有更多时间专注于…

django/CVE-2017-12794XSS漏洞复现

docker搭建漏洞复现环境 漏洞原理看帮助文档 # Django debug page XSS漏洞(CVE-2017-12794)分析Django发布了新版本1.11.5,修复了500页面中可能存在的一个XSS漏洞,这篇文章说明一下该漏洞的原理和复现,和我的一点点评…

一种借助MYSQL递归CTE生成所有组合情况的实现方法

需求说明 有如下表和数据: Nname1户口2查询机构数过多3危险驾驶4多头用信 需要输出name里的所有组合情况,即单个值,两两组合,三个组合、四个组合。结果为2的n次方-1中情况,这里是15。 预期结果为: Com…

【OpenCV入门】第四部分——阈值

文章结构 阈值概述阈值处理函数二值化阈值处理二值化阈值处理反二值化处理 零处理低于阈值零处理超出阈值零处理 截断处理自适应处理Otsu方法 阈值概述 在PhotoShop里头,有一个工具可以快速抠出一幅图像中的轮廓,这个工具就是阈值。OpenCV也提供了阈值&…

springboot实战(二)之将项目上传至远程仓库

目录 环境: 背景: 操作: 1.注册码云账号 2.创建仓库 步骤: 1.注册完码云账号后,点击加号,新建仓库 2.输入项目名称和介绍,点击创建 3.复制仓库地址,你可以选择https协议或者…

ClickHouse进阶(五):副本与分片-2-Distributed引擎

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 📌订阅…