jvm垃圾收集器简介

news2024/10/10 5:20:55

串行垃圾收集器

串行垃圾收集器,是指使用单线程进行垃圾回收,垃圾回收时,只有一个线程在工作,Java应用中的所有线程都要暂停,等待垃圾回收的完成。这种现象称之为STW(Stop-The-World),一般的javaweb应用中不会采用这种收集器

并行垃圾收集器

并行垃圾收集器是在串行的基础上做了改进,将单线程改为了多线程,但在收集的过程中仍会暂停应用程序,只是并行执行,速度更快,暂停的时间更短。

  • ParNew垃圾收集器

该垃圾收集器工作在年轻代上,通过-XX:+UserParNewGC参数设置,老年代仍然是串行垃圾收集器。

  • ParallelGC垃圾收集器

该收集器是在ParNewGC的基础上新增了两个参数,使得使用起来更灵活高效。

相关参数如下:

  • -XX:+UseParallelGC
    • 年轻代使用ParallelGC收集器,老年代串行
  • -XX:+UseParallelOldGC
    • 年轻代和老年代都使用该收集器
  • -XX:+MaxGCPauseMillis
    • 设置最大的垃圾收集的停顿时间,单位毫秒
    • 设置该参数可能会调整堆的大小或其他的参数,如果堆的大小设置的过小,就 会GC工作的频繁,反而会影响性能
  • -XX:UseAdaptiveSizePolicy
    • 自适应GC模式,垃圾回收器将自动调整新生代和老年代等参数,达到吞吐量,堆大小、停顿时间之间的平衡
    • 一般用于手动调整参数比较困难的场景,让收集器自动进行调整
  • -XX:GCTimeRatio
    • 设置垃圾回收时间占程序运行时间的百分比,公式为1/(1+n)
    • 它的值在0~100之间,默认值为99,即垃圾回收时间不超过1%

CMS垃圾收集器

CMS全称Concurrent Mark Sweep,是一款并行的,使用标记清除算法的收集器,该收集器是针对老年代进行垃圾回收的,通过-XX:+UserConcMarkSweepGc进行设置。执行过程如下:

  • 初始化标记(CMS-initial-mark),标记root,会导致stw;
  • 并发标记(CMS-concurrent-mark)。与用户线程同步进行
  • 预清理(CMS-concurrent-preclean).与用户线程同时运行
  • 重新标记(CMS-remark),会导致stw
  • 并发清除(CMS-concurrent-sweep),与用户线程同时运行
  • 调整堆大小,设置CMS在清理之后进行内存压缩,目的是清理内存中的碎片
  • 并发重置状态等待下次CMS的触发(CMS-concurrent-reset),与用户线程同时进行

G1垃圾收集器

原理

G1垃圾收集器相对于其他收集器而言,最大的区别在于取消了年轻代、老年代的物理划分,取而代之的是将堆划分为若干个区域(Region),这些区域包含了有逻辑上的年轻代、老年代区域,各代的存储是不连续的,每一代都是用n个不连续的大小相同的区域,每个区域占有一块连续的虚拟内存地址。如下图:

这样的好处就是不用对单独的空间进行设置,不用担心内存不足

每个内存分段都可以被标记为Eden区,Survivor区,Old区和Humongous区,这样属于不同代,不同区的内存分段就可以不必连续了。

G1中有一个特殊的区域:Humongous区。如果一个对象占用的空间超过了分区容量(Region)的50%,G1收集器会默认该对象是一个巨大对象(humongous object,H-obj),该对象有以下特征:

  • 默认直接分配到年老代,防止反复拷贝移动。
  • 该对象在并发标记清理阶段和Full GC阶段回收不再存活的对象
  • 在分配巨型对象之前先检查java堆占用率阈值,如果超过的话就启动并发标记,为的是提早回收从而防止Evacuation Failures 和Full GC
  • Young GC

Young GC主要是对Eden区进行GC,它在Eden空间被耗尽时会被触发

  • Eden空间的数据移动到Survivor中,如果Survivor空间不够,Eden区的部分数据会直接到年老代
  • Survivor区的数据移动到新的Survivor区中,部分数据到年老代空间中
  • 最终Eden空间的数据为空,GC停止工作,应用线程继续执行。
  • Remember Set(Rset,已记忆集合)

G1中引入了RSet的概念,其作用是跟踪指向某个对象的跟踪引用

在每个分区内部又被分为了若干个大小为512byte的卡片(card),标记对内存的最小可用粒度。所有分区的卡片将会记录在全局卡片表(Global Card Table)中,分配的对象会占用物理上连续的若干个卡片,当查找对分区内对象的引用时便可以通过记录卡片来查找该引用你对象。每次对内存的回收,都是对指定分区的卡片进行处理。

  • Mixed GC

当越来越多的对象到Old区中,为了避免内存被耗尽,虚拟机 会触发混合的垃圾回收机制,即(Mixed GC),该算法不是一个Old GC,除了回收年轻代之外,还会回收一部分的年老代,可以控制堆哪些年老代回收,从而控制垃圾回收的时间,也需要注意的是:Mixed GC不是Full GC

MIxed GC什么时候触发,是由参数XX:InitiatingHeapOccupancyPercent 决定,默认45%。该参数的意思是:当年老代大小占整个堆大小的百分比。

它的GC分为两步

1、全局并发标记 2、拷贝存活对象(evacuation)

  • 全局并发标记
    • 初始标记
      • 标记从根节点直接可达的对象,这个阶段会执行一次年轻代GC,产生全局停顿
    • 根区域扫描
      • G1 GC在初始标记的存活区扫描对年老代的引用,并标记被引用的对象
      • 该阶段和应用程序(非STW)同时运行,并且只有完成该阶段后,才开始下一次STW的年轻代回收
    • 并发标记
      • G1 GC在整个堆中查找存活的对象。该阶段和应用程序同时进行,可以被STW年轻代回收终端
    • 重新标记
      • 该阶段是STW回收,因为程序在运行,对上一次的标记进行修正
    • 清理垃圾
      • 清点和重置标记状态,该阶段会进行STW,整个阶段并不实际区垃圾回收。等待evacuation阶段回收
  • 拷贝存活对象

Evacuation阶段是全暂停的。该阶段把一部分Region中的存活对象拷贝到另一部分的Region中,从而实现垃圾清理

Full GC

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

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

相关文章

深入理解 pnpm(Performant NPM) 的实现原理及其与 npm 的区别

深入理解 pnpm 的实现原理及其与 npm 的区别 在 JavaScript 生态系统中,包管理器是开发者日常工作中不可或缺的工具。npm(Node Package Manager)作为 Node.js 的默认包管理器,已经广泛应用于各种项目中。然而,随着项目…

略谈发展测量方法论-高敏雪老师的文章解读与收获

历史地看, GDP 被誉为“世纪性发明”,我们曾经将其视为衡量一国经济发展的重要工具;现实地看,“超越 GDP”是当前出现的带有国际性的口号,内在地包含着对 GDP作为发展指标的批评和替代。 如何看到发展? 如…

apisix云原生网关

定义 企业级网关通过域名、路由将请求分发到对应的应用上,通常承载数千个服务的流量,对稳定性有较高要求。 CNCF全景图 选型 Kubernetes抽象出两个核心概念:Service,为多个Pod提供统一的访问入口;Ingress&#xff…

【STM32-HAL库】实现微秒、毫秒、纳秒延时。(STM32F4系列)(附带工程下载链接)

使用了本代码后不能使用HAL库自带的HAL_Delay函数 使用了本代码后不能使用HAL库自带的HAL_Delay函数 使用了本代码后不能使用HAL库自带的HAL_Delay函数 一、新建工程 可以参考我的新建工程系列教程 stm32-HAL库cubeMX新建工程教程(以F103C8T6为例)ht…

【长文梳理webserver核心】核心类篇

前言 有三个核心组件支撑一个reactor实现 [持续] 的 [监听] 一组fd,并根据每个fd上发生的事件 [调用] 相应的处理函数。这三个组件就是 EventLoop 、Channel 以及 Poller 三个类,其中 EventLoop 可以看作是对业务线程的封装,而 Channel 可以看…

从零开始搭建一个node.js后端服务项目

一、下载node.js及配置环境 网上很多安装教程,此处就不再赘述了 版本信息 C:\Users\XXX>node -v v20.15.0C:\Users\XXX>npm -v 10.7.0 二、搭建node.js项目及安装express框架 在任意位置创建一个项目文件夹,此处项目文件夹名为test&#xff0…

右键菜单添加cmd

regedit 计算机\HKEY_CLASSES_ROOT\Directory\Background\shell\命令提示符\command 数据:cmd.exe /s /k title 命令提示符 或软件商店安装 Windows Terminal

基于element-ui的upload组件与阿里云oss对象存储的文件上传(采用服务端签名后直传的方式)

服务端签名后直传图解 步骤 1 开通阿里云OSS对象存储服务&#xff0c;创建新的Bucket 2 创建子账户获取密钥 创建用户 添加权限 后端 1 新建一个第三方服务的模块 third-party pom文件 <?xml version"1.0" encoding"UTF-8"?> <project x…

HAL+M4学习记录_3

一、HAL库开发框架 记录HAL学习过程 1.1 CMSIS CMSIS&#xff08;Cortex微控制器软件接口标准&#xff09;&#xff0c;用于提供用户和硬件间的接口&#xff0c;用户通过CMSIS标准对Cortex微控制器内部寄存器单元进行读写 1.2 HAL库 HAL&#xff08;硬件抽象层&#xff09;为…

加固与脱壳04 - 一些简单的脱壳方法

这里只讨论一些简单壳的脱壳方法及其原因。 FRIDA-DEXDump https://github.com/hluwa/FRIDA-DEXDump 适用于不需要研究那些被强保护起来的代码&#xff0c;只是想单纯的看看某个地方的业务逻辑。 原理&#xff1a; 对于完整的 dex&#xff0c;采用暴力搜索 dex035&#xf…

云栖实录 | Hologres3.0全新升级:一体化实时湖仓平台

本文根据2024云栖大会实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a; 姜伟华 | 阿里云智能集团资深技术专家、Hologres 负责人 丁 烨 | 阿里云智能集团产品专家、Hologres 产品负责人 活动&#xff1a; 2024 云栖大会 - 商用大数据计算与分析平台论…

基于Arduino的超声波和舵机模块集成使用

一.超声波模块和舵机模块集成使用 超声波模块&#xff1a;HC-SR04舵机模块&#xff1a;SG90目的&#xff1a;通过Arduino UNO核心板控制舵机旋转到不同位置&#xff0c;同时获取不同位置超声波模块和障碍物间的距离&#xff0c;配合控制算法&#xff0c;进行基于超声波智能避障…

需求10——通过改一个小bug来学习如何定位问题

在浏览我之前完成的一些小需求时&#xff0c;我发现了一个非常有价值的需求。这个需求可以让我深入了解系统中关于故障上报的功能。通过完善这个需求&#xff0c;我能够全面掌握整个故障上报的流程。 这个需求主要是关于故障上报流程中出现的问题。当前的流程如下&#xff1a;…

ML 系列:机器学习和深度学习的深层次总结(16) — 提高 KNN 效率-使用 KD 树和球树实现更快的算法

一、说明 在机器学习系列的第 16 节&#xff0c;我们重点介绍了提高 K 最近邻 &#xff08;KNN&#xff09; 算法的效率&#xff0c;这是一种广泛用于分类和回归任务的方法。虽然 KNN 简单有效&#xff0c;但对于大型数据集来说&#xff0c;其计算成本可能会令人望而却步。为了…

基于SpringBoot问卷调查系统小程序【附源码】

基于SpringBoot问卷调查系统小程序 效果如下&#xff1a; 管理员登录界面 管理员功能界面 调查人管理界面 问卷调查管理界面 问卷题目管理界面 用户登录界面 APP首页界面 公告信息界面 研究背景 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&…

组织病理学图像中的再识别|文献速递--基于多模态-半监督深度学习的病理学诊断与病灶分割

Title 题目 Re-identification from histopathology images 组织病理学图像中的再识别 01 文献速递介绍 在光学显微镜下评估苏木精-伊红&#xff08;H&E&#xff09;染色切片是肿瘤病理诊断中的标准程序。随着全片扫描仪的出现&#xff0c;玻片切片可以被数字化为所谓…

怎么在单片机裸机程序中移植EasyLogger?

1、介绍 EasyLogger 是一款超轻量级、高性能的C日志库&#xff0c;非常适合对资源敏感的软件项目。例如&#xff1a;IoT产品、可穿戴设备、智能家居等等。相比log4c、zlog这些知名的C日志库&#xff0c;EasyLogger的功能更加简单&#xff0c;提供给用户的接口更少&#xff0c;但…

肺腺癌预后新指标:全切片图像中三级淋巴结构密度的自动化量化|文献精析·24-10-09

小罗碎碎念 本期这篇文章&#xff0c;我去年分享过一次。当时发表在知乎上&#xff0c;没有标记参考文献&#xff0c;配图的清晰度也不够&#xff0c;并且分析的还不透彻&#xff0c;所以趁着国庆假期重新分析一下。 这篇文章的标题为《Computerized tertiary lymphoid structu…

基于springboot vue 校园失物招领平台的设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm springcloud等开发框架&#xff09; vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆…

【AIGC】OpenAI API在快速开发中的实践与应用:优化ChatGPT提示词Prompt加速工程

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;使用最新型号确保最佳实践利用最新模型进行高效任务处理为什么要选择最新模型&#xff1f;结论 &#x1f4af;指令与上下文的分隔最佳实践分隔指令和上下文的重要性使用符…