jvm之垃圾回收器

news/2024/4/20 5:21:56/文章来源:https://blog.csdn.net/lixiaoyi01/article/details/129163578

分类

  • 按线程
    • 串行
    • 并行
  • 工作模式
    • 并发式
    • 独占式
  • 碎片处理方式
    • 压缩式
    • 非压缩式
  • 工作内存空间
    • 年轻代
    • 老年代

评估GC的性能指标

  • 吞吐量:运行用户代码的时间占总运行时间的比例
  • 暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间
  • 内存占用: java堆区所占的内存大小

垃圾回收器

  • Serial
    • 回收年轻代
    • 采用复制算法、串行回收和“Stop-the-world”机制的方式执行内存回收
    • 优势
      • 简单而高效(在单线程比),比较适合单CPU
    • 使用场景
      • 可用内存一般不大,可以在较短时间内完成垃圾收集,只有不频繁发生,使用串行回收器是可以接受的
    • 使用-XX:+UseSerialGC 参数可以指定年轻代和老年代都使用串行收集器
      • 等价于 新生代使用 Serial GC,且老年代使用Serial Old GC
  • Serial Old
    • 回收老年代
    • 采用了串行回收和“stop the world”机制,只不过内存回收算法使用的是标记-压缩算法
      • Serial Old是运行在Client模式下默认的老年代的垃圾回收器
      • Serial Old在server模式下主要有两个用途
        • 与新生代的Parallel Scavenge配合使用
        • 作为老年代的CMS收集器的后备垃圾收集方案
  • ParNew
    • 回收年轻代
    • 采用复制算法、串行回收和“Stop-the-world”机制的方式执行内存回收
  • Parallel Scavenge
    • 回收年轻代
    • 采用复制算法、串行回收和“Stop-the-world”机制的方式执行内存回收
    • 可控制吞吐量
    • 自适应调节策略
    • 搞吞吐量可以高效率的利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。常见案例
      • 批量处理
      • 订单处理
      • 工资支付
      • 科学计算
    • 参数配置
      • -XX:+UseParallelGC 手动指定年轻代使用parallel并行收集器执行内存回收任务
      • -XX:+UseParallelOldGC: 手动指定老年代都是使用并行回收收集器。
        • 分别适用于新生代和老年代。默认jdk8是开启的
        • 上面两个参数,默认开启一个,另一个也会被开启
      • -XX:ParallelGCThreads 设置年轻代并行收集器的线程数。一般地,最好与CPU数量相等,以避免过多的线程数影响垃圾收集性能
        • 在默认情况下,当CPU数量小于8个,ParallelGCThreads 的值等于CPU数量
        • 当CPU数量大于8个,ParallelGCThreads 的值等于 3+ [5*CPU]/8
      • -XX:MaxGCpauseMillis 设置垃圾收集器最大停顿时间。毫秒
      • -XX:GCTimeRatio 垃圾收集时间占总时间的比例(=1/(N+1))。用于衡量吞吐量的大小
        • 默认值 99 (0,100)
      • -XX:+UseAdaptiveSizePolicy 设置Parallel Scavenge 收集器具有自适应调节策略
        • 在这种模式下,年轻代的大小、eden和survivor的比例、晋升老年代的对象年龄等参数会被自动调整,已达到在堆大小、吞吐量和停顿时间之间的平衡点
        • 在手动调优比较困难的场合,可以直接使用这种自适应的方式,仅指定虚拟机的最大堆、目标的吞吐量和停顿时间,让虚拟机自己完成调优工作
  • Parallel Old
    • 回收老年代
    • 标记压缩算法
    • 并行回收
    • stop-the-world机制
  • CMS
    • 回收老年代
    • 低延迟、并发
    • 标记清除算法
    • stop-the-world
    • 工作过程
      • 初始标记
        • 所有的工作线程会stw,这个阶段的主要任务仅仅是标记出GC Roots能直接关联到的对象。一旦标记完成之后就会恢复之前被暂停的所有应用线程。由于直接关联对象比较小,所以速度非常快
      • 并发标记
        • 从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行
      • 重新标记
        • 由于在并发标记阶段中,程序的工作线程会和垃圾收集线程同时运行,因此为了修正并发标记期间,因用户线程继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间通常会比初始标记阶段稍长一些,但也远比并发标记阶段的时间短
      • 并发清除
        • 此阶段清理删除掉标记阶段判断的已经死亡的对象,释放内存空间
    • 垃圾回收时机
      • 不能等到内存不足才进行回收,因为回收和用户线程是并发执行的,需要设置一定的阈值,便开始进行回收,要是CMS运行期间预留的内存无法满足程序的需求,就会出现“Concurrent Mode Failure”失败,这是jvm启动预备方案,临时使用Serial Old收集器来重新进行老年代的垃圾收集,这样停顿时间就长了
    • 优点:
      • 并发收集
      • 低延迟
    • 缺点
      • 会产生碎片
      • 对CPU资源非常敏感
        • 在并发阶段,虽然不会导致用户停顿,但会因为占用了一部分线程而导致应用程序变慢,总吞吐量会降低
      • 无法处理浮动垃圾
        • 并发标记如果产生新的垃圾对象,CMS将无法对这些垃圾对象进行标记,最终会导致这些新产生的垃圾对象没有被及时回收
    • 为什么要重新标记
      • 一个本应该不是垃圾的对象被视为了垃圾
      • 增量更新是站在新增引用的对象的角度来解决问题。所谓增量更新,就是在赋值操作之前添加一个写屏障,在写屏障中记录新增的引用。比如,用户线程要执行:A.f = F;那么在写屏障中将新增的这个引用关系记录下来。标准的描述就是,当黑色对象新增一个白色对象的引用时,就通过写屏障将这个引用关系记录下来。然后在重新标记阶段,再以这些引用关系中的黑色对象为根,再扫描一次,以此保证不会漏标。
    • 常用参数
      • -XX:+UseConcMarkSweepGC 手动指定使用CMS
      • -XX:CMSInitiatingOccupanyFraction 设置堆内存使用率的阈值,一旦达到该阈值,便可以进行回收
      • -XX:+UseCMSCompactAtFullCollection 用于指定在执行完Full GC对内存空间进行压缩整理,以此避免内存碎片的产生。
      • -XX:CMSFullGCsBeforeCompaction 设置在执行多少次Full GC后对内存空间进行压缩整理
      • -XX:ParallelCMSThreads 设置CMS的线程数量
  • G1
    • 整堆
    • 特点
      • 并行与并发
        • 并行性:G1在回收期间,可以有多个GC线程同时工作,有效利用多核计算能力。此时用户线程stw
        • 并发性:G1拥有与应用程序交替执行的能力,部分工作可以和应用程序同时执行,因此,一般来说,不会在整个回收阶段发生完全阻塞应用的情况
      • 分代收集
        • 会区分年轻代和老年代,年轻代依然有eden区和s区。但从堆的结构上看,它不要求整个eden区、年轻代或者老年代都是连续的,也不再坚持固定大小和固定数量
        • 将堆空间分为若干个区域,这些区域中包含了逻辑上的年轻代和老年代
        • 兼顾年轻代和老年代
      • 空间整合
        • CMS 标记清除算法、内存碎片、若干此GC后进行一次碎片整理
        • 内存回收时以region作为单位的。region之间是复制算法,但整体上可以看做是标记压缩算法
      • 可预测的停顿时间模型
        • 可以预测:使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒
    • 参数设置
      • -XX:+UseG1GC 手动指定使用G1收集器执行内存回收任务
      • -XX:G1HeapRegionSize 设置每个region的大小。值是2的幂,范围是1MB到32MB之间,目标是根据最小的java堆大小划分出约2048个区域。默认是堆内存的1/2000
      • -XX:MaxGCPauseMillis 设置期望达到的最大GC停顿时间指标(JVM会尽力实现,但不保证达到)。默认是2000ms
      • -XX:ParallelGCThread 设置STW工作线程数的值。最多设置为8
      • -XX:ConcGCThreads 设置并发标记的线程数。将n设置为并行垃圾回收线程数(ParallelGCThreads)的1/4左右
      • -XX:InitiatingHeapOccupancyPercent 设置触发并发GC周期的java堆占用率阈值。超过此值,就触发GC。默认是45
    • 区域
      • Eden
      • S
      • Old
      • H
      • 如果一个对象的容量超过了0.5的region就会放到h区,如果一个放不下,就找连续的空间存放 也是放在H区
    • 回收过程
      • 年轻代GC
      • 老年代并发标记过程
      • 混合回收

查看默认的垃圾回收器

  • -XX:+PrintCommandLineFlags: 查看命令行相关参数(包含使用的垃圾收集器)
  • 使用命令行指令:jinfo -flag 相关垃圾回收器参数 进程ID
  • jdk8 新生代采用的是Parallel Scavenge,老年代Parallel Old。
  • jdk9 使用的G1

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

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

相关文章

BurpSuite实战教程02-BurpSuite+夜神模拟器抓包教程

工具介绍 BurpSuite BurpSuite是用于“攻击”web 应用程序的集成平台(java编写),包含了许多工具。Burp Suite为这些工具设计了许多接口,以加快攻击应用程序的过程。所有工具都共享一个请求,并能处理对应的HTTP 消息、…

使用Autoware标定工具包联合标定相机和激光雷达

前面文章介绍了,安装autoware标定工具包、ros驱动usb相机、robosense-16线激光雷达的使用,本文记录使用Autoware标定工具包联合标定相机和激光雷达的过程。1.ros驱动相机,启动相机;启动激光雷达2.联合录制bag包rosbag record -a 参…

k8s1.23.0+ubuntu20.04+docker23+hyperv

问题 k8s node节点加入到集群时卡住 “[preflight] Running pre-flight checks” # master节点重新生成加入命令 kubeadm token create --ttl 0 --print-join-command参考 注意 k8s1.24使用containerd而不再使用docker,因此使用k8s1.23版本 环境 k8s: 1.23.0 u…

TestNG和Junit的区别,测试框架该如何选择?

要想知道两个框架的区别,首先分别介绍一下两个框架。 TestNG是一个java中的开源自动化测试框架,其灵感来自JUnit和NUnit,TestNG还涵盖了JUnit4整个核心的功能,但引入了一些新的功能,使其功能更强大,使用更…

记一次docker虚拟机横向移动渗透测试

本次渗透在几个docker虚拟机间多次横向移动,最终找到了一个可以进行docker逃逸的出口,拿下服务器。渗透过程曲折但充满了乐趣,入口是172.17.0.6的docker虚拟机,然后一路横向移动,最终在172.17.0.2出实现了docker逃逸&a…

【vue2每日小知识】实现store中modules模块的封装与自动导入

🥳博 主:初映CY的前说(前端领域) 🌞个人信条:想要变成得到,中间还有做到! 🤘本文核心:省去我们store仓库中分模块时的需要每次导入index的问题 目录 【前言】在store中如何简…

ELK日志分析--Filebeat

ELK架构 Filebeat简介 Filebeat安装 Filebeat简单使用 专用日志搜集模块 案例模块-Nginx 模块 重读日志文件 使用Processors(处理器)过滤和增强数据 1.ELK架构 2.Filebeat简介 可以使用 Filebeat 收集各种日志,之后发送到指定的目标系统上,但是同…

软件测试面试题 —— 整理与解析(1)

😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:🌎【Austin_zhai】🌏 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能&#xf…

【华为OD机试真题】用 C++ 实现 - 数字加减游戏

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

程序员如何发展第二职业?这几种副业方式超赚钱

很多程序员曾表示,虽然月薪一两万,但有时候还是会焦虑。 尤其是遇上了年初裁员年底裁员这样的就业环境,焦虑就会逐步放大,这时候副业赚钱的重要性就体现出来了。 发展第二职业,可以让程序员们增加抗风险能力&#xf…

数据结构-考研难点代码突破(树型查找 - 红黑树(RBT)插入流程图,删除)

文章目录1. 红黑树的定义和性质红黑树的插入操作流程红黑树的删除(了解)1. 红黑树的定义和性质 红黑树查找与删除的效率和AVL树相同。 但是因为AVL树在插入或删除节点可能破坏AVL树结构,而重新调整树的开销大。所以引出了红黑树。 红黑树的…

【Jmeter】ForEach控制器

一、什么是ForEach控制器 ForEach控制器是遍历某个数组读取不同的变量值,来控制其下的采样器或控制器执行一次或多次。而这个数组可以是用户自定义变量,也可以是从前面接口请求中提取到需要的数据,然后进行遍历循环。 二、ForEach控制器相关…

技能提升:Python技术应用工程师职业技能提升

职业技术培训-Python技术应用工程师分为高级培训班、中级培训班及初级培训班。 Python是一种跨平台的计算机程序设计语言,是一个高层次的结合了解释性、编译性、互动性和面向对象的语言。最初被设计用于编写自动化脚本Shell(适用于Linux操作系统&#xf…

Linux PWM 开发指南

Linux PWM 开发指南 1 概述 1.1 编写目的 介绍 PWM 模块的详细设计方便相关人员进行 PWM 模块的代码设计开发。 1.2 使用范围 适用于 Linux-3.10,linux-4.4 和 Linux-4.9 内核,Linux-5.4 内核。 1.3 相关人员 PWM 驱动的开发人员/维护人员等 2 术…

数据库系统概论——绪论

1、绪论 1.1、数据库系统概述 数据库系统的构成示意图 1.1.1、数据库系统基本概念 基本概念:数据、数据库、数据库管理系统和数据库系统 1)数据(data) 定义:描述事物的符号记录称为数据数据是数据库中存储的基本对象…

中科检测赴中科院广州电子CASAIM开展座谈会,围绕3D打印、三维扫描和精密测量展开深入交流

2月9日,中科检测技术服务(广州)股份有限公司(简称:中科检测)一行到访中科院广州电子技术有限公司,参观广东省增材制造工程实验室和三维扫描及精密测量重点实验室,就3D打印、三维扫描和精密测量相关技术内容…

NTP同步时钟为医院提供标准的时间信号

NTP同步时钟应用于城市重要公共领域,如车站、学校、医院、等。NTP同步时钟可提供准确的公众时间,为人们的日常生活提供便利,避免了因时钟不准确而带来的不便。NTP同步时钟采用智能模块化设计,与同类产品相比,更突出了安…

JavaScript Web API实战:7个小众技巧让你的网站瞬间提升用户体验

随着技术的日新月异,为开发人员提供了令人难以置信的新工具和API。但据了解,在100 多个 API中,只有5%被开发人员积极使用。 让我们来看看一些有用的Web API,它们可以帮助您将网站推向月球! 1、 截屏接口 Screen Capt…

ELK日志分析--Logstash

Logstash简介 Logstash安装 测试运行 配置输入和输出 使用Geoip过滤器插件增强数据编辑 配置接收 Beats 的输入 1.Logstash简介 Logstash管道具有两个必需元素input和output,以及一个可选元素filter。输入插件使用来自源的数据,过滤器插件根据你的…

shell的测试语句

一、shell的条件测试语句 在写shell脚本时,经常遇到的问题就是判断字符串是否相等,可能还要检查文件状态或进 行数字测试,只有这些测试完成才能做下一步动作。 1.1、shell脚本中的条件测试如下: 1、文件测试 2、字符串测试 3、数…