G1垃圾收集器-JVM(十三)

news2025/4/7 15:37:58

上篇文章说了CMS垃圾收集器使用以及三色标记如何解决cms的一些问题。分别有初始标记,并发标记,重新标记,并发清理,并发重置。

CMS垃圾收集器&三色标记-JVM(十二)

  • G1收集器(Garbage-First)

-XX:+UseG1GC

这是一款面向服务器的垃圾收集器,主要针对设备多核cpu和大内存的机器。以极高效率满足GC停顿时间要求,还具备高吞吐性能特征。

Region

G1让我们忘记以前的年轻代老年代,但只是物理和以前不同,但是他会分为多个大小相等的小块(Region),jvm最多可以有2048个region。

每个小块分别代表E(eden)、S(survivor)、O(old)、H(humongous)。

一般默认就是划分2048个region,比如堆内存是4096M,则Region是堆的大小除以2048,每个region的大小是2M。推荐默认方式。

(也可以用-XX:G1HeapRegionSize= 来修改他的大小)

所以老年代和年轻代已经在物理上不是连续的,而是分为不同的region集合。

默认年轻代占比百分5,如果堆大小是4096,每个region是2M,那么对应大概100个Region。

可以通过-XX:G1NewSizePercent设置新生代初始占比。

在系统运行的时候也会慢慢给年轻代增加占比,但最大不会超过百分之60。

最大值也可以设置-XX:G1MaxNewSizePercent调整

比例还如之前的比例8:1:1,比如现在100个region,eden则是80个,s0和s1分别是10。

动态变化:一个region之前是老年代,但是做完GC之后可能变成年轻代,说明region区域功能可能动态变化。

G1垃圾收集和前面都是一样的,唯一不同的就是对大对象的处理,G1有专门分配大对象region的区域叫humongous区,而不是让大对象进入老年代中,节约老年代空间,正常大于region百分之50的对象就属于大对象,直接进入humongous,当对象太大的时候,会跨多个humongous存储。fullGC的时候会将humongous一起回收。

(前面说了一个region是2M,也就是大于1M的时候直接进入humongous)

  • G1收集器步奏

  1. 初始标记:STW暂停其他线程,记录GC roots直接引用的对象,速度很快
  2. 并发标记(Concurrent Marking):用户线程和GC线程一起运行标记,与CMS的并发标记类似。
  3. 最终标记:STW暂停其他线程,整理一些刚刚标记的对象,与CMS重复标记类似。
  4. 筛选回收(Clearup,STW):
  5. 筛选标记:筛选是对各个region的回收价值和成本进行排序,根据用户所期望的GC停顿进行STW时间来制定回收计划(-XX:MaxGCPauseMillis),如果1000个region满了,这时候默认是200ms,只能回收800个region,这800个region就是Collection set,尽量把gc回收控制在我们指定时间内。这个阶段也可以与用户线程并行,但因为只回收一部分,并且时间可控,所以STW效率可以更高。他是采用复制算法来垃圾回收,所以几乎不会产生碎片。内部使用复制算法,但是从整体来看,像是标记整理算法。

(注意:CMS回收阶段是用户线程一起并发,G1内部太复杂,并没有并发回收,不过到了ZGC,Shenandoah就实现并发收集,Shenandoah可以看做并发升级版本)

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

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

相关文章

浅析缓存一致性的解析方案

各位同学们平时开发的时候除了使用到数据库(这里以mysql为例)还会用到相关的缓存(这里以redis为例)操作。 举一个常用的场景当我们写的接口性能相对比较慢的时候(高并发场景需要响应速度很快)为了保证性能的…

LeetCode144. 二叉树的前序遍历

144. 二叉树的前序遍历 文章目录 [144. 二叉树的前序遍历](https://leetcode.cn/problems/binary-tree-preorder-traversal/)一、题目二、思路及代码(1)递归(2)迭代(两种方法) 一、题目 给你二叉树的根节点…

AlienSwap 首期 Launchpad — 偶像女团 NFT+RWA 的创新探索

NFT 是整个加密市场一致看好,并认为会继续爆发的领域。随着更多的 NFT 平台和 NFT 项目的推出,NFT 市场的格局也在不断变化。从开始的 OpenSea 占据绝对领先地位,到 Blur 的横空出世风头无两,在加密领域,局势更迭总是在…

【Java面试丨并发编程】线程中并发安全

一、Synchronized关键字的底层原理 1. Synchronized的作用 Synchronized【对象锁】采用互斥的方式让同一时刻至多只有一个线程能持有【对象锁】,其他线程再想获取这个【对象锁】时就会阻塞住 2. Monitor Synchronized【对象锁】底层是由Monitor实现,…

泰裤辣!这是什么操作,自动埋点,还能传参?

目录 前言 参数放在注释中 准备入口文件 编写插件 运行代码 完整代码 参数放在局部作用域中 准备源代码 编写插件 运行代码 完整代码 总结 前言 在上篇文章讲了如何通过手写babel插件自动给函数埋点之后,就有同学问我,自动插入埋点的函数怎么…

基于IMX6ULL的AP3216C的QT动态数据曲线图显示

前言:本文为手把手教学 LinuxQT 的典型基础项目 AP3216C 的数据折线图显示,项目使用正点原子的 IMX6ULL 阿尔法( Cortex-A7 系列)开发板。项目需要实现 AP3216C 在 Linux 系统下的驱动,使用 QT 设计 AP3216C 的数据显示页面作为项目的应用层。…

消息中间件RabbitMQ简介

1.1消息队列中间件简介 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题实现高性能,高可用,可伸缩和最终一致性[架构] 使用较多的消息队列有ActiveMQ,RabbitMQ&#xff…

人工智能安全风险:零信任的作用

人工智能(AI)和机器学习技术飞速发展,我们所处的时代正在经历前所未有的创新。但是,技术飞速发展的同时也带来了各种挑战。人工智能技术越来越复杂,与之相关的网络安全风险也越来越棘手,随之产生了一个新的…

TortoiseGit 入门指南10:贮藏

有时,当你在项目的一部分上已经工作一段时间后,所有东西都进入了混乱的状态, 而这时你想要切换到另一个分支做一点别的事情。 问题是,你不想仅仅因为过会儿回到这一点而为做了一半的工作创建一次提交。 针对这个问题的答案是贮藏 …

【Linux指令集】---unzip指令(超详细)

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【Linux专栏】🎈 本专栏旨在分享学习Linux的一点学习心得,欢迎大家在评论区讨论💌 演示环境&#xff1…

JVM系统优化实践(19):GC生产环境案例(二)

您好,这里是「码农镖局」CSDN博客,欢迎您来,欢迎您再来~ 接昨天的问题继续来说,在高并发场景中,对象过多容易导致OOM。由于高并发导致Young GC存活对象过多,因此会有太多对象进入老年代&#xf…

关于unity Content Size Fitter 套 Content Size Fitter

首先:最好不要unity Content Size Fitter 套 Content Size Fitter 这样最后得到的变化可能会错误 unity也提示了,父物体如果有了,那么子物体就不要再加了。 但是你们要的需求: 一级父物体 ➡自适应大小➡二级父物体&#xff08…

经典目标检测R-CNN系列(2)Fast R-CNN

经典目标检测R-CNN系列(2)Fast R-CNN Fast R-CNN是作者Ross Girshick继R-CNN后的又一力作。 同样使用VGG16作为网络的backbone,与R-CNN相比训练时间快9倍,测试推理时间快213倍,准确率从62%提升至66%(Pascal VOC数据集上)。 1 Fast R-CNN的…

Java List 与数组互转

前言 略 数组转 List 方法1 Employee[] array new Employee[]{emp1, emp2, emp3}; List<Employee> list Arrays.asList(array);Arrays.asList 返回的是固定长度的数组&#xff0c;扩大或缩小列表的操作将返回UnsupportedOperationException。 数组转 List 方法2 E…

【C++STL】“vector“容器的模拟实现

vector的模拟实现 模拟实现成员变量构造函数无参构造函数初始化n个val的构造函数迭代器区间构造函数 拷贝构造析构函数begin&#xff08;&#xff09;end&#xff08;&#xff09;swap&#xff08;&#xff09;reserve()resize()capacity()size()重载[]运算符重载赋值运算符ins…

自学网络安全(黑客)为什么火了?

网安专业从始至终都是需要学习的&#xff0c;大学是无法培养出合格的网安人才的。这就是为啥每年网安专业毕业生并不少&#xff0c;而真正从事网安岗位的人&#xff0c;寥寥无几的根本原因。 如果将来打算从事网安岗位&#xff0c;那么不断学习是你唯一的途径。 网络安全为什…

应对 618、双十一等大促期间的高负载,API 性能测试应该怎么做?负载测试、基线测试、冒烟测试、浸泡测试、峰值测试和尖峰测试详解

随着应用程序和服务交付速度的不断提高&#xff0c;在按时交付应用程序的竞赛中&#xff0c;性能测试往往会退居其次。但是&#xff0c;在节假日期间&#xff0c;购物额都会大幅增长。在这种一年中的成败时刻&#xff0c;公司是无法接受他们的应用程序在高负载下变得不可靠的。…

第四章 云原生架构之Kubernetes基础知识

1、K8S整体架构 1.1、概述 ​ Kubernetes是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;简称 K8S。K8S的本质是一组服务器集群&#xff0c;可以在对应服务器集群的每个节点上运行程序&#xff0c;来对节点中的容器进行管理。类似Mas…

Pytest+Jenkins+Allure的接口自动化测试

目录 生成Allure 两种形式 一 项目内直接生成不依赖Jenkins 1.先安装好allure 将allure\bin配置到环境变量中 cmd 命令行输入&#xff1a;allure 校验是否安装成功 2. 将json文件生成html文件 执行 allure generate report/ -o report/html其中的report/ 为生成的json路径&a…

OCPM和CPM有什么区别?

CPM和OCPM这两种收费模式的对比 Cpm&#xff1a;表示千次展示费用&#xff0c;是数据指标&#xff0c;也是一种出价方式。代表展现一千次的消费&#xff0c;也就是你展现1000次要给媒体多少钱 例如某企业广告曝光量是50万&#xff0c;总广告价格为10000元&#xff0c;那么千人…