JVM(HotSpot)7种垃圾收集器

2023-11-04

JVM(HotSpot)7种垃圾收集器

7种垃圾收集器作用于不同的分代,如果两个收集器之间存在连续,就说明他们可以搭配使用。

从JDK1.3到现在,从Serial收集器-》Parallel收集器-》CMS-》G1,用户线程停顿时间不断缩短,但仍然无法完全消除。

 

1、Serial收集器(串行收集器)

   

  Serial收集器是最基本、发展历史最悠久的收集器,曾是(JDK1.3.1之前)虚拟机新生代收集的唯一选择。

  Serial收集器是一个单线程的收集器。“单线程”的意义不仅仅是它只会使用一个CPU或一条收集器线程去完成垃圾收集工作,更重要的是它在垃圾收集的时候,必须暂停其他所有工作的线程,直到它收集结束。

  Serial收集器是HotSpot虚拟机运行在Client模式下的默认新生代收集器。

  Serial收集器具有简单而高效,由于没有线程交互的开销,可以获得最高的单线程收集效率(在单个CPU环境中)。

  "-XX:+UseSerialGC":添加该参数来显式的使用Serial垃圾收集器。

 

2、ParNew收集器

  ParNew收集器是Serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参数、收集算法、Stop The Word、对象分配规则、回收策略等都与Serial收集器一样。

  ParNew收集器是许多运行在Server模式下的虚拟机首选的新生代收集器,其中一个原因是,除了Serial收集器之外,目前只有ParNew收集器能与CMS收集器配合工作。 

  "-XX:+UseConcMarkSweepGC":指定使用CMS后,会默认使用ParNew作为新生代收集器。

       "-XX:+UseParNewGC":强制指定使用ParNew。   

       "-XX:ParallelGCThreads":指定垃圾收集的线程数量,ParNew默认开启的收集线程与CPU的数量相同。

  并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。

  并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行,可能是交替执行),用户线程继续工作,而垃圾收集程序运行在另一个CPU上。

 

3、Parallel Scavenge收集器

  Parallel Scavenge收集器是一个新生代收集器,使用复制算法,且是并行的多线程收集器。

  Parallel Scavenge收集器关注点是达到一个可控制的吞吐量(吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)),而其他收集器关注点在尽可能的缩短垃圾收集时用户线程的停顿时间。

  Parallel Scavenge收集器提供了两个参数来用于精确控制吞吐量,一是控制最大垃圾收集停顿时间的 -XX:MaxGCPauseMillis参数,二是控制吞吐量大小的 -XX:GCTimeRatio参数;

  “ -XX:MaxGCPauseMillis” 参数允许的值是一个大于0的毫秒数,收集器将尽可能的保证内存垃圾回收花费的时间不超过设定的值(但是,并不是越小越好,GC停顿时间缩短是以牺牲吞吐量和新生代空间来换取的,如果设置的值太小,将会导致频繁GC,这样虽然GC停顿时间下来了,但是吞吐量也下来了)。

  “ -XX:GCTimeRatio”参数的值是一个大于0且小于100的整数,也就是垃圾收集时间占总时间的比率,默认值是99,就是允许最大1%(即1/(1+99))的垃圾收集时间。

  “-XX:UseAdaptiveSizePolicy”参数是一个开发,如果这个参数打开之后,虚拟机会根据当前系统运行情况收集监控信息,动态调整新生代的比例、老年大大小等细节参数,以提供最合适的停顿时间或最大的吞吐量,这种调节方式称为GC自适应的调节策略。

 

4、Serial Old收集器

  Serial Old收集器是Seria收集器的老年代版本,他同样是一个单线程收集器,使用" 标记-整理" 算法。

  Serial Old收集器主要用于Client模式下的虚拟机使用。

  Server模式下的两大用途:一、在JDK1.5及之前的版本与Parallel Scavenge收集器搭配使用;二、作为CMS收集器的后备方案,在并发收集发生Conturrent Mode Failure时使用。

 

5、Paraller Old收集器

  Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。

  在JDK1.6中才出现。

 

6、CMS(Conturrent Mark Sweep)收集器

  

  CMS收集器是一种以获取最短回收停顿时间为目标的收集器。

  目前很大一部分的Java应用集中在互联网或者B/S系统的服务端上。

  CMS收集器是基于“标记-清除”算法实现,它的整个运行过程可以分为:初始登记(标记一下GC Roots能直接关联到的对象,这个过程速度很快)、并发标记(进行GCRoots Tracing的过程)、重新标记(修正并发标记期间因用户线程继续运作而导致标记产生变动的那一部分对象的标记记录,速度稍慢)、并发清除(清除死亡的对象)4个步骤;其中,初始标记和重新标记仍然需要“Stop The World”。

  CMS收集器运行的整个过程中,最耗费时间的并发标记和并发清楚过程收集器线程和用户线程是一起工作的,所以总体来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。

  优点:并发收集、低停顿。

  缺点:

    一:CMS收集器对CPU资源非常敏感。虽然在两个并发阶段不会导致用户线程停顿,但是会因为占用了一部分线程而导致应用程序变慢,总吞吐量下降。CMS默认启动的回收线程数是(CPU数量+3)/4。

    二:CMS收集器无法处理浮动垃圾,可能出现“Conturrent Mode Failure”失败而导致另一次Full GC产生。由于CMS并发清除阶段用户线程还在运行,伴随着程序还在产生新的垃圾,这一部分垃圾出现在标记之后,CMS无法在当次收集中处理掉它们,只能留到下次再清理,这一部分垃圾称为“浮动垃圾”。也正是由于在垃圾收集阶段用户线程还在运行,那么也就需要预留有足够的内存空间给用户线程使用,因此CMS收集器不能像其他收集器那样等待老年代填满之后再进行收集,需要预留一部分空间给并发收集时用户程序使用。可以通过“-XX:CMSInitiatingOccupancyFraction”参数设置老年代内存使用达到多少时启动收集。

    三:由于CMS收集器是一个基于“标记-清除”算法的收集器,那么意味着收集结束会产生大量碎片,有时候往往还有很多内存未使用,可是没有一块连续的空间来分配一个对象,导致不得不提前触发一次Full GC。CMS收集器提供了一个“-XX:UseCMSCompactAtFullCollection”参数(默认是开启的)用于在CMS收集器顶不住要FullGC时开启内存碎片整理(内存碎片整理意味着无法并发执行不得不停顿用户线程)。参数“-XX:CMSFullGCsBeforeCompaction”来设置执行多少次不压缩的Full GC后,跟着来一次带压缩的(默认值是0,意味着每次进入Full GC时都进行碎片整理)。

  

7、G1(Garbage-First)收集器

  

  G1收集器是当今收集器技术发展的最前沿成果之一;

  相比其它收集器,具有如下特点:

    1、并行与并发:G1能够重发利用多CPU、多核环境下的优势,使用多个CPU来缩短Stop-The-World停顿时间。

    2、分代收集:与其他收集器一样,分代概念在G1中依然存在。

    3、空间整合:与CMS的“标记-清理”算法不同,G1从整体来看是基于“标记-整理”来实现的收集器,从局部(两个Region之间)上来看是基于“复制”算法实现的,这两种算法都意味着G1运作期间不会产生内存空间碎片,收集后能够提供整体的可用内存。

    4、可预测停顿:G1除了追求低停顿之外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒。

  使用G1收集器时,Java堆的内存布局与其他收集器有很大的区别,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留着新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,他们都是一部分Region(不需要连续)的集合。

  G1收集器之所以能够建立可预测的停顿时间模型,是因为它可以有计划地避免在整个Java对中进行全区域的垃圾收集。G1跟踪各个Region里面垃圾堆积的价值大小(回收所获得的空间大小以及回收所需要时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region(这也是Garbage-First名称的由来)。

  G1收集器的运作大致可分为:

    1、初始标记:需要停顿,耗时短;

    2、并发标记:

    3、最终标记:需要停顿,可并发执行;

    4、筛选标记:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM(HotSpot)7种垃圾收集器 的相关文章

  • C与C++的函数相互调用

    无法直接调用原因 C 和 C 的函数可以相互调用 但需要一些特殊的注意事项 因为它们有不同的编译和链接规则以及一些语法差异 链接规则 C 语言的链接器通常使用 C 标准的函数命名和调用约定 而 C 链接器使用 C 的函数命名和调用约定 这意
  • c 语言private用法,举例分析private的作用(c/c++学习)

    c 中private的用处 我知道我们可以用 public 中的值 把private中的数据给提出来 但是还是搞不懂private该怎么用 或者说在一个具体程序中 private有什么用 class fun public void setn
  • HTTP协议版本检测

    HTTP 2 0在2015年就已经正式发布了 但是现在大部分网站还在使用HTTP 1 1协议 具体怎么查看网站采用的是HTTP 1 1 还是HTTP 2 0呢 本篇就介绍几种检测HTTP协议版本的方法 所有的操作都是基于Chrome浏览器
  • Week 2 Git& Github: Branch

    首先进入git目录 建议通过windows powershell操作 git branch new branch 创建一个新分支 git checkout branch 跳转到指定分支 git checkout b branchname 创
  • Spring MVC Controller传递枚举值示例

    功能描述 本文将通过一个小示例 展示在请求参数中传递枚举值 枚举定义 角色类定义 public enum RoleEnum EMPLOYEE short 1 Employee MANAGER short 2 Manager private
  • echarts前后端交互数据_前后端交互技术有哪些

    我们都知道 一个完整的IT项目是由多个不同岗位的成员共同完成 包括UI设计 前端开发 后端开发 测试等 为了实现项目的完整性 前后端需要运用技术实现联通 不过 前后端交互技术有哪些 参加郑州Web前端培训班会学吗 且看小编的分析 目前常用的
  • Java常见算法(六)【省份数量- 分组算法:深度优先、广度优先、并查集 】

    文章目录 省份数量 经典的分组算法 1 深度优先遍历 2 广度优先 3 并查集 算法 实验源码 省份数量 经典的分组算法 https www bilibili com video BV1Jv411A7Ty p 34 比如现在有三个城市 A城
  • Ai-M61/62系列的固件烧录指导

    文章目录 前言 一 软硬件的准备 二 原始硬件接线 三 烧录软件的使用 联系我们 前言 本文介绍Ai M61 62系列模组 开发板的固件烧录 一 软硬件的准备 Ai M61 62系列模组或者开发板一个 Ai M61 62烧录软件 下载链接
  • 进程和计划服务管理

    一 进程和服务 服务 是在操作系统内部活依赖网络环境运行的一种软件组件提供特定的功能或服务 服务一般在后台运行 职责包括接受请求 处理数据 执行操作 服务可以是系统自带的 也可以是基于linux开发的应用程序 服务特点 1 服务可以通过端口
  • YouTube-8M: A Large-Scale Video Classification Benchmark

    Abstract Many recent advancements in Computer Vision are attributed to large datasets Open source software packages for
  • 基于Android studio 的rpg游戏大地图的绘制

    今天开始写第一篇博客 好激动呢 衷心希望自己能坚持下去 不说闲话了 我们马上开始 最近一直在做一个基于Android studio的rpg2D角色扮演游戏 虽然说这个游戏已经烂大街了 其中的逻辑也是有了很多准确的简便的解释 不过真正做起来还
  • 【c++迭代器模拟实现】

    目录 前言 一 STL初始 二 六大组件之迭代器 迭代器初始 迭代器的模拟实现 1 victor 正向迭代器 反向迭代器1 反向迭代器2 反向迭代器3 2 list 正向迭代器 反向迭代器 总结 前言 打怪升级 第52天 一 STL初始 什

随机推荐

  • Oracle如何查询和中止正在运行的JOB

    今天遇到一个问题 有一个JOB会一直不停的执行 不能按照设定的间隔来执行 通过查询相关资料发现原来如此 当一个oracle job运行时返回一个error时 oracle会再次设法执行它 第一次尝试是在一分钟后 第二次是在2分钟后 第三次是
  • 代码点和代码单元的简单理解

    简单来说 代码单元就是用来表示代码点的 char数据类型就是一个采用UTF 16编码表示Unicode码点的代码单元 那代码点是什么 就是在unicode编码中的每一个符号 在特殊符号没出现之前 每个unicode代码点 字符在内 可以用一
  • 数据结构【2019年408第41题】

    1 一个N长度的链表的为了按照题目的需求 我们观察可以发现可以将一个链表从中间分开然后逆置然后依次插入则我们大致的思路如下 1 将链表分为两段 L和L2 2 将L2逆置从顺的顺序变为反过来的顺序 3 将L和L2按照 L gt L2 gt L
  • 高通LK显示屏分辨率太大,下半部分显示异常-FB buff超了的问题

    问题解决 bootable bootloader lk include dev fbcon h define LOGO IMG OFFSET 12 1024 1024 改成 define LOGO IMG OFFSET 20 1024 10
  • 前端利用html2canvas+jspdf实现html转pdf

    公司业务的月报页面 要实现pdf下载 查了资料 大概有个方向 就是利用html2canvas把html转为图片 然后再生成pdf格式的文件实现了下载 核心代码 import html2canvas from html2canvas impo
  • @Async注解在springboot项目中的使用

    众所周知 Async注解是开启一个异步线程的执行 但在springboot项目中如何具体的使用这个注解 还需要一一分析 仔细研究如何能更好的使用 Async注解 1 在项目启动类上添加 EnableAsync注解 如果没有这个注解而仅仅只有
  • 虚拟机安装Ubuntu16.04详细步骤

    文章目录 系统下载 安装VMware 配置虚拟机 系统安装 系统下载 官方下载地址 https ubuntu com download 阿里云镜像 推荐 http mirrors aliyun com ubuntu releases 16
  • linux/vim 操作tips

    1 Linux查看物理CPU个数 核数 逻辑CPU个数 总核数 物理CPU个数 X 每颗物理CPU的核数 总逻辑CPU数 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 查看物理CPU个数 cat proc cpuinfo grep
  • 服务器部署redis和springboot整合redis详细步骤

    目录 redis服务器部署 在springboot项目中整合redis redis相关链接 文档 文件下载 阿里云服务器官网 云小站 专享特惠 云产品推荐 阿里云 redis服务器部署 购买阿里云服务器后 到控制台查看实例 获取公网IP 账
  • 蓝桥杯——方格填数(JAVA)

    题目 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 如下的 10个格子 填入 0 9 的数字 要求 连续的两个数字不能相邻 左右 上下 对角都算相邻 一共有多少种可能的填数方案 运行限制 最大运行时间 1s 最大运
  • 【全】正则表达式语法

    简单来说 正则表达式就是描述字符串的规则 其作用如下 1 校验数据的有效性 2 从文本中提取内容 3 文本内容替换 元字符 元字符即正则表达式中具有特殊含义的专用字符 主要分为5类 1 基础 任意字符 换行除外 d 任意数字 D 任意非数字
  • Android自定义控件之自定义属性(二)

    前言 上篇介绍了自定义控件的基本要求以及绘制的基本原理 本篇文章主要介绍如何给自定义控件自定义一些属性 本篇文章将继续以上篇文章自定义圆形百分比为例进行讲解 有关原理知识请参考Android自定义控件之基本原理 一 这篇文章 需求产生背景
  • 关于MPEG4 码流(mpeg4 raw data)的格式分析

    MPEG4码流开头往往如下 00 00 01 B0 F5 00 00 01 B5 09 00 00 01 00 00 00 01 20 08 86 84 00 3F 18 58 21 20 A3 1F 00 00 01 B2 58 76 6
  • 故障诊断1—基础理论

    1 故障诊断概念 故障诊断主要研究如何对系统中出现的故障进行检测 分离和辨识 即判断故障是否发生 定位故障发生的部位和种类 以及确定故障的大小和发生的时间等 2 故障诊断方法 故障诊断防范可分为定性分析和定量分析两大类 如图 1 所示 其中
  • Hexo博客优化:在Next主题中设置进阶版Live2D看板娘————拒绝踩坑!!!!

    最初级的用法 使用官方包安装 安装非常简单 但效果一般 hexo live 2d地址 https github com xiazeyu live2d widget models git命令行中输入 npm install save hexo
  • [SWPUCTF 2022 新生赛]ez_ez_php

    这段代码是一个简单的PHP文件处理脚本 让我们逐行进行分析 error reporting 0 这行代码设置了错误报告的级别为0 意味着不显示任何错误 if isset GET file 这行代码检查是否存在一个名为 file 的GET参数
  • Redis第二十七讲 Redis集群批量操作带来的问题

    Redis集群批量操作 比如对我们之前搭建的三主三从集群进行批量数据插入操作会报什么错误呢 关于Redis集群搭建可以参考我之前的一篇博客 Redis第十九讲 Redis主从 哨兵 集群搭建讲解 Redis集群搭建相对于哨兵还是比较简单的
  • app服务器 数据库文件,app访问服务器mysql数据库文件

    app访问服务器mysql数据库文件 内容精选 换一换 云数据库RDS服务上的MySQL在使用上有一些固定限制 用来提高实例的稳定性和安全性 具体详见表1 对于mysqlpump工具 由于在并行备份场景有coredump问题 不建议您使用
  • 特征工程(一)-- 概述

    简介 特征工程本质上可以理解成数据预处理 其目的是最大限度地从原始数据中提取特征以供算法和模型使用 从而提高模型的准确率等指标 处理的数据中的特征直接影响到正在使用的模型以及能达到的最好的结果 当模型和特征都确定之后 通过调参带来的收益微乎
  • JVM(HotSpot)7种垃圾收集器

    JVM HotSpot 7种垃圾收集器 7种垃圾收集器作用于不同的分代 如果两个收集器之间存在连续 就说明他们可以搭配使用 从JDK1 3到现在 从Serial收集器 Parallel收集器 CMS G1 用户线程停顿时间不断缩短 但仍然无