JVM知识总结(G1收集器)

news2024/12/29 10:45:01

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

在这里插入图片描述

G1收集器

G1**(Garbage First)是一款面向服务器的垃圾收集器,主要针对配置多核处理器以及大容量内存的机器,满足GC停顿时间要求的同时,还具备高吞吐量性能特征**。

  • JDK 9 开始默认使用G1 垃圾收集器

内存划分

G1将堆划分为多个大小相等的独立的Region区域。

一般Region区的大小等于堆空间的总大小除以2048,比如目前的堆空间总大小为8GB,就是8192MB/2048=4MB,那么最终每个Region区的大小为4MB

  • 也可以用参数-XX:G1HeapRegionSize强制指定每个Region区的大小。

新生代和老年代

默认新生代对堆内存的初始占比是5%,如果堆大小为8GB,那么年轻代占据400MB左右的内存,对应大概是100个Region区,可以通过-XX:G1NewSizePercent设置新生代初始占比。

在Java程序运行中,JVM会不停的给新生代增加更多的Region区,但是最多新生代的占比不会超过堆空间总大小的60%,可以通过-XX:G1MaxNewSizePercent调整。

新生代中的Eden区和Survivor区对应的Region区比例也跟之前一样,默认8:1:1,假设新生代现在有400个Region,那么整个新生代的占比则为Eden=320,S0/From=40,S1/To=40

G1中的年老代晋升条件和之前的无差,达到年龄阈值的对象会被转入年老代的Region区中,不同的是对于大对象的分配,在G1中不会让大对象进入年老代,在G1中由专门存放大对象的Region区叫做Humongous区,如果在分配对象时,判定出一个对象属于大对象,那么则会直接将其放入Humongous区存储。

在G1中,判定一个对象是否为大对象的方式为:

对象大小是否超过单个普通Region区的50%,如果超过则代表当前对象为大对象,那么该对象会被直接放入Humongous区。

  • 比如:目前是8GB的堆空间,每个Region区的大小为4MB,当一个对象大小超过2MB时则会被判定为属于大对象。

如果程序运行过程中出现一个巨型对象,当一个Humongous区存不下时,可能会横跨多个Region区存储它。

Humongous区存在的意义:

可以避免一些短命的巨型对象直接进入年老代,节约年老代的内存空间,可以有效避免年老代因空间不足时的GC开销。

当堆空间发生全局GC(FullGC)时,除开回收新生代和年老代之外,也会对Humongous区进行回收。

什么场景下适合采用G1收集器的建议

堆空间内50%以上的内存会被存活占用的应用。

分配速度和晋升速度特别快的应用。

至少8GB以上堆内存的应用。

采用原本分代收集器GC时间会长达1s+的应用。

追求停顿时间在500ms以内的应用。

GC类型

YoungGC:

在G1中,当新生代区域被用完时,G1首先会大概计算一下回收当前的新生代空间需要花费多少时间,如果回收时间远远小于参数-XX:MaxGCPauseMills设定的值,那么不会触发YoungGC,而是会继续为新生代增加新的Region区用于存放新分配的对象实例。

  • 用户未显式通过-XX:MaxGCPauseMills参数设定GC预期回收停顿时间值,那么G1默认为200ms

直至某次Eden区空间再次被放满并经过计算后,此次回收的耗时接近-XX:MaxGCPauseMills参数设定的值,那么才会触发YoungGC

YoungGC被触发时,首先会将目标Region区中的存活对象移动至幸存区空间(Survivor-From区标志的Region)。

同时达到晋升年龄标准的对象也会被移入至年老代Region中存储。

  • G1收集器在发生YoungGC时,复制移动对象时是采用的多线程并行复制,以此来换取更优异的GC性能。

MixedGC:

当整个堆中年老代的区域占有率达到参数-XX:InitiatingHeapOccupancyPercent设定的值后触发MixedGC,发生该类型GC后,会回收所有新生代Region区、部分年老代Region区(会根据期望的GC停顿时间选择合适的年老代Region区优先回收)以及大对象Humongous区。

正常情况下,G1垃圾收集时会先发生MixedGC,主要采用复制算法,在GC时先将要回收的Region区中存活的对象拷贝至别的Region区内,拷贝过程中,如果发现没有足够多的空闲Region区承载拷贝对象,此时就会触发一次Full GC

FullGC:

当整个堆空间中的空闲Region不足以支撑拷贝对象或由于元数据空间满了等原因触发,在发生FullGC时,G1首先会停止系统所有用户线程,然后采用单线程进行标记、清理和压缩整理内存,以便于清理出足够多的空闲Region来供下一次MixedGC使用。

但该过程是单线程串行收集的,因此这个过程非常耗时(ShenandoahGC中采用了多线程并行收集)。

  • G1收集器中并没有FullGC,,G1中的FullGC是采Sserial old FullGC。

GC过程

在这里插入图片描述

G1收集器在发生GC时执行过程大致会分为四个步骤(主要指MixedGC):

初始标记(InitialMark):

  • 先触发STW,然后使用单条GC线程快速标记GCRoots直连的对象。

并发标记(ConcurrentMarking):

  • 与CMS的并发标记过程一致,采用多条GC线程与用户线程共同执行,根据Root根节点标记所有对象。

最终标记(Remark):

  • 同CMS的重新标记阶段(也会STW),主要是为了纠正并发标记阶段因用户操作导致的错标、误标、漏标对象。

筛选回收(Cleanup):

  • 先对各个Region区的回收价值和成本进行排序,找出 回收价值最大 的Region优先回收。
  • 筛选回收阶段在G1收集器中是会停止所有用户线程后,采用多线程并行回收的。

假设此时年老代空间共有800Region区,并且都满了,所以此刻会触发GC。

但根据GC的预期停顿时间值,本次GC只能允许停顿200ms,而G1经过前面的成本计算后,大致可推断出:

  • 本次GC回收600Region区恰好停顿时间可控制在200ms左右,那么最终就会以 回收600Region区 为基准触发GC,这样则能尽量确保GC导致的停顿时间可以被控制在我们指定的范围之内。

G1会在后台维护着一个优先列表:

  • CollectionSet(CSet),它记录了GC要收集的Region集合,集合里的Region可以是任意年代的。

在G1中回收算法都是采用复制算法,都会将一个Region区中存活的对象复制到另外一个Region区内。

G1缺点:

G1需要记忆集 (卡表)来记录新生代和老年代之间的引用关系。

  • 这种数据结构在 G1 中需要占用大量的内存,可能达到整个堆内存容量的 20% 甚至更多。
  • 而且 G1 中维护记忆集的成本较高,带来了更高的执行负载,影响效率。

CMS 在小内存应用上的表现要优于 G1,而大内存应用上 G1 更有优势,大小内存的界限是6GB到8GB。

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

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

相关文章

Mocaverse「Enter MOCALAND」上线!

我们很高兴宣布 Mocaverse 和 The Sandbox 将开展一项新合作——「Enter MOCALAND!」 继 “Into the Unknow” Game Jam 成功举办之后,我们的创作者们在此基础上创作出了近 50 款未来派多人游戏,我们很高兴能继续与社区一起庆祝共同创作&…

Redis与DataBase保持数据一致性

文章目录 1. 读取数据2. 写数据2.1 先操作缓存2.2 先操作数据库 在我们系统中缓存最常用的策略是:服务端需要同时维系DB和Cache,并且是以DB的结果为准, Cache-Aside Pattern(缓存分离模式、旁路缓存)。 1. 读取数据 当…

高质量翻译对中国移动应用在国外市场推广的影响

在移动应用的竞争格局中,打入国外市场对中国开发商来说既是机遇也是挑战。决定中国移动应用程序在海外成功的最关键因素之一是其翻译质量。高质量的翻译在有效推广该应用程序、确保其与当地用户产生共鸣,并最终推动新市场的采用和增长方面发挥着关键作用…

嵌入式全栈开发学习笔记---数据结构(广度优先算法)

目录 过程分析 代码实现 queue_maze.c 上节我们讲完了队列,本节开始学习广度优先算法! 之前我们用深度优先算法找出从迷宫出来的所有路径,本次我们要用广度优先算法找出最短路径。 过程分析 广度优先算法也叫广度优先搜索。 这种算法就相当…

Qwen2-Math 开源 AI 模型发布;阿里云推出首个域名 AI 大模型应用丨 RTE 开发者日报

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思…

vscode用快捷键一键生成vue模板

项目中有些代码模块是固定的,如下面的代码所示,为了不重复写这些相同的代码,我们可以使用快键键一键生成模板。 流程: 中文:首选项-> 用户代码片段 -> 输入框中输入vue,找到vue.json文件(没有vue.j…

如意AI健康管理开放域自然对话算法分析报告

一、算法全周期行为分析 1. 算法安全 信息内容安全:通过意图识别和实体抽取技术,确保生成的内容不涉及违法或不当信息。 信息源安全:数据采集环节采用安全措施,保护数据不被非法访问。 2. 算法监测 信息安全监测:实施实…

国产芯上运行TinyMaxi轻量级的神经网络推理库-米尔基于芯驰D9国产商显板

本篇测评由优秀测评者“短笛君”提供。 本文将介绍基于米尔电子MYD-YD9360商显板(米尔基于芯驰D9360国产开发板)的TinyMaxi轻量级的神经网络推理库方案测试。 算力测试 TinyMaix 是面向单片机的超轻量级的神经网络推理库,即 TinyML 推理库&a…

重头开始嵌入式第十六天(结构体,共用体)

目录 结构体 结构体定义 结构体初始化 结构体赋值 结构体调用 结构体大小 在 C 语言中,结构体内存对齐规则主要遵循以下原则: 共用体 共用体定义 共同体赋值,初始化 共用体大小 结构体与共用体的区别 结构体 在 C 语言中,…

vuex properties of undefined (reading ‘getters‘)

前言: 最近打算用vue 写个音乐播放器,在搞 vuex 的时候遇到一个很神奇报错;vuex 姿势练了千百次了,刚开始的时候我一直以为是代码问题,反复检查了带了,依旧报错。 Error in mounted hook: "TypeError:…

PHP全方位多功能投票小程序系统源码

🌟【全民参与,决策更精彩】全方位多功能投票小程序大揭秘!🎉 🚀 开篇引入:投票新风尚,尽在指尖 Hey小伙伴们,你是否厌倦了传统的投票方式,觉得它们既繁琐又不够灵活&am…

历代文学-技术生态-总体介绍

1. 历代文学简介 历代文学(https://literature.sinhy.com/#/literature?__c1000,微信小程序可直接搜索“历代文学”)是一个由两个人(一个后端和一个前端)开发的文学网站,是一个收录从古到今、以及古今中外…

C++之运算符重载系列深入学习:从入门到精通!

为什么需要对运算符进行重载 C预定义中的运算符的操作对象只局限于基本的内置数据类型,但是对于我们自定义的类型是没有办法操作的。但是大多时候我们需要对我们定义的类型进行类似的运算,这个时候就需要我们对这么运算符进行重新定义,赋予其…

智能家居中高性能联网通信方案,乐鑫ESP32-S3/C3无线Wi-Fi蓝牙应用

随着科技的飞速发展,智能家居已经不再是科幻小说中的概念,而是走进了千家万户的现实生活。 智能家居是广泛的系统性产品概念,以住宅为载体,运用物联网、网络通信和人工智能等技术,接收信号并判断,提供更加…

美股全线反弹,市场情绪回暖

一、市场概况 昨夜美股三大股指全线收涨,市场情绪明显回暖。道琼斯工业平均指数上涨1.76%,纳斯达克综合指数上涨2.87%,标普500指数则上涨2.3%。美债市场方面,美国十年期国债收益率上涨1.141%,报3.99%,两年…

[ Python ]使用Charles对Python程序发出的Get与Post请求抓包-解决Python程序报错问题

目录 一、前言 二、Charles 三、抓取Python请求 3.1 正常运行 3.2 程序报错 3.2.1 报错信息 3.2.2 解决方法 3.3 取消警告信息 四、总结 一、前言 在Python开发中,网络请求是常见的操作之一。无论是使用内置的urllib库还是第三方库requests,都可…

Java小白入门到实战应用教程-Scanner类及IO流讲解

Java小白入门到实战应用教程-Scanner类及IO流讲解 Scanner类 我们前面写的很多例子都是程序独自执行的,但是我们做编程写代码的目的是要实现能人和代码去交互的。 现在我们就来了解一个知识点,去实现最简单的人和程序的交互。 在java中通过Scanner类…

MySQL第3讲--数据类型和表的修改和删除

文章目录 前言数据类型数值类型整数类型浮点数和定点数 字符串类型字符类型:文本类型:二进制数据类型 日期和时间类型实例分析 表的操作添加字段修改字段删除字段修改表名删除表 DDL总结DDL数据库操作DDL表操作 前言 上一节在MySQL第2讲–关系型数据库以…

kubernetes 管理平台 Pod管理多容器 与嵌入式脚本

资源清单文件 模板与帮助信息 管理资源对象 多容器 Pod 管理多容器 Pod 自定义任务 容器保护策略 宽限期策略 Pod调度策略

CUDA编程从零到壹

如今,当我们谈论深度学习时,为了提高性能,我们通常会将其实现与使用 GPU 联系起来。 GPU(图形处理单元)最初设计用于加速图像、2D 和 3D 图形的渲染。然而,由于它们能够执行许多并行操作,它们的…