JVM专题十二:JVM 中的收集器二

上一篇JVM专题十一:JVM 中的收集器一咱们介绍了垃圾收集器的分类,已经主流的分代垃圾收集器重点看了CMS与三色标记算法,本篇咱们继续来看意G1、ZGC等。

G1收集器

G1(Garbage-First Garbage Collector)是一种服务器端的垃圾收集器,专为大堆内存和低延迟垃圾收集设计。以下是G1收集器的关键特性和工作模式的概述:

G1收集器关键特性

  1. 分代收集:G1将堆内存分为多个大小相等的区域(Region),每个Region可以是Eden、Survivor或Old区。

    • 可以通过-XX:G1HeapRegionSize=n设置Region大小。
  2. 大对象处理:大对象(超过Region大小50%的对象)会被放入专门的Humongous区。

    • 大对象可能横跨多个Region。
  3. 增量回收:G1可以逐步、增量地执行垃圾回收,有助于控制停顿时间。

  4. 并行回收:G1可以利用多核CPU并行回收垃圾,提高回收速度。

  5. 标记-整理算法:老年代回收使用标记-整理算法,避免内存碎片化。

    • 新生代回收使用复制算法。
  6. STW(Stop the World):G1在垃圾回收时仍需STW,但增加了预测机制来控制停顿时间。

  7. 停顿时间预测:用户可以通过-XX:MaxGCPauseMillis指定期望的停顿时间。

G1收集器工作模式

  1. Young GC:当Eden区内存不足时触发,回收新生代Region。

  2. Mixed GC:当老年代空间占比超过-XX:InitiatingHeapOccupancyPercent设定的阈值时触发,回收年轻代和部分老年代Region。

    • 采用复制算法。
  3. Full GC:当老年代空间不足且-XX:G1HeapWastePercent设定过低时可能触发,进行整个堆的回收。

G1收集器参数设置

G1收集器参数设置 -XX:+UseG1GC:使用G1收集器-XX:ParallelGCThreads:指定GC工作的线程数量-XX:G1HeapRegionSize:指定分区大小(1MB~32MB,且必须是2的N次幂),默认将整堆划分为2048个分区-XX:MaxGCPauseMillis:目标暂停时间(默认200ms)-XX:G1NewSizePercent:新生代内存初始空间(默认整堆5%,值配置整数,默认就是百分比)-XX:G1MaxNewSizePercent:新生代内存最大空间-XX:TargetSurvivorRatio:Survivor区的填充容量(默认50%),Survivor区域里的一批对象(年龄1+年龄2+年龄n的多个年龄对象)总和超过了Survivor区域的50%,此时就会把年龄n(含)以上的对象都放入老年代-XX:MaxTenuringThreshold:最大年龄阈值(默认15)-XX:InitiatingHeapOccupancyPercent:老年代占用空间达到整堆内存阈值(默认45%),则执行新生代和老年代的混合收集(MixedGC),比如我们之前说的堆默认有2048个region,如果有接近1000个region都是老年代的region,则可能就要触发MixedGC了-XX:G1MixedGCLiveThresholdPercent(默认85%)  region中的存活对象低于这个值时才会回收该region,如果超过这个值,存活对象过多,回收的的意义不大。-XX:G1MixedGCCountTarget:在一次回收过程中指定做几次筛选回收(默认8次),在最后一个筛选回收阶段可以回收一会,然后暂停回收,恢复系统运行,一会再开始回收,这样可以让系统不至于单次停顿时间过长。-XX:G1HeapWastePercent(默认5%): gc过程中空出来的region是否充足阈值,在混合回收的时候,对Region回收都是基于复制算法进行的,都是把要回收的Region里的存活对象放入其他Region,然后这个Region中的垃圾对象全部清理掉,这样的话在回收过程就会不断空出来新的Region,一旦空闲出来的Region数量达到了堆内存的5%,此时就会立即停止混合回收,意味着本次混合回收就结束了。

G1收集器优化建议

G1垃圾收集器的优化主要集中于平衡GC的频率和停顿时间,以及管理新生代和老年代之间的对象晋升。以下是一些针对G1收集器的优化建议:

  1. 合理设置-XX:MaxGCPauseMillis:这个参数定义了G1试图达到的最大GC停顿时间。如果设置得过高,可能会导致年轻代GC不频繁,从而在触发时有大量对象存活并晋升到老年代。相反,如果设置得过低,可能会导致GC过于频繁,影响整体性能。

  2. 监控年轻代GC后的存活对象:监控每次年轻代GC后存活下来的对象数量,以评估当前的GC策略是否有效。如果存活对象过多,可能需要调整-XX:MaxGCPauseMillis或其他相关参数。

  3. 调整新生代大小:通过-XX:G1NewSizePercent-XX:G1MaxNewSizePercent参数调整新生代的大小,以适应应用的特定需求。确保新生代足够大,可以容纳大部分短暂存活的对象,减少对象晋升到老年代的频率。

  4. 监控Survivor区使用情况:Survivor区溢出是对象晋升到老年代的一个常见原因。如果Survivor区频繁溢出,可能需要增加其大小或调整其他参数。

  5. 使用动态年龄判定规则:G1使用动态年龄判定规则来决定对象何时晋升到老年代。监控这一规则的效果,并根据应用的行为调整-XX:TargetSurvivorRatio-XX:MaxTenuringThreshold参数。

  6. 避免频繁的Mixed GC:频繁的Mixed GC可能会影响性能。通过调整参数,尽量使Mixed GC在必要时才触发,并且每次回收的Region数量能够有效地控制停顿时间。

  7. 监控和优化Full GC:虽然G1旨在减少Full GC的发生,但在某些情况下仍然可能触发。监控Full GC的发生频率,并优化堆空间使用,以减少Full GC的影响。

  8. 使用G1收集器的调优工具:使用JVM提供的工具,如GC日志和JVM监控工具,来分析GC行为并进行调优。

  9. 考虑应用特定行为:不同的应用可能有不同的内存分配模式和GC需求。根据应用的具体行为来调整G1的参数,以达到最优性能。

  10. 测试和评估:在不同的负载和条件下测试G1的参数设置,评估其对性能的影响,并根据测试结果进行调整。

通过细致地调整和监控G1收集器的参数,可以优化垃圾收集的性能,减少GC引起的停顿时间,提高应用的响应速度和吞吐量。

G1收集器适用场景

  • 大堆内存应用(8GB以上)。
  • 对象分配和晋升速度变化大。
  • 需要低延迟和可预测停顿时间的垃圾收集。

G1收集器通过其创新的Region划分和垃圾收集策略,为现代Java应用提供了一种有效的垃圾收集解决方案,尤其适用于大堆内存和对延迟敏感的应用场景。通过合理的参数设置和监控,G1可以显著提高应用的性能和响应性。

ZGC收集器

ZGC(The Z Garbage Collector)是Java虚拟机(JVM)在JDK 11中引入的一种实验性质的低延迟垃圾收集器,专为大内存和低延迟服务设计。以下是对ZGC收集器特性和工作过程的整理:

ZGC关键特性

  • 低延迟目标:最大GC停顿时间不超过10ms。
  • 大堆支持:设计用于支持TB级别的内存容量,当前支持8MB到4TB,未来可支持16TB。
  • 与堆大小无关的停顿时间:停顿时间不随堆大小或活跃对象大小的增加而增长。
  • 指针染色(Colored Pointer):在对象指针中嵌入额外的位来存储对象的状态信息,如是否被移动或存活状态。
  • 读屏障(Load Barrier):在对象访问时插入的特殊检查,用于确保访问的正确性,并处理对象移动后的指针更新。

内存布局

  • 采用基于Region的内存布局,但与G1不同,ZGC的Region不分代。
  • 64位虚拟地址空间划分为多个子空间,包括Java堆、M0地址空间、M1地址空间和Remapped空间。

工作过程

ZGC周期由三个STW(Stop-The-World)暂停和四个并发阶段组成:

  1. 标记开始(Mark Start):初始标记GC Roots直接可达的对象。
  2. 重新映射开始(Relocation Start):选择将要清理的内存区域,并建立数据结构以进行对象移动。
  3. 并发标记/重新映射 (M/R):并发遍历对象图,标记所有可达的对象,并更新指向移动对象的引用。
  4. 并发引用处理 (RP):处理软引用、弱引用等特殊引用类型。
  5. 并发转移准备 (EC):确定哪些内存区域将被清理,并准备数据结构。
  6. 并发转移 (RE):将存活的对象从旧位置移动到新位置,应用程序可继续运行。

优势

  • 利用指针染色和读屏障技术,实现几乎整个垃圾收集过程的并发执行,显著降低停顿时间。
  • 支持大容量内存,适用于未来大规模内存需求的应用。

局限性

  • 由于采用“空间换时间”的策略,可能会占用更多的地址空间。
  • 目前仅支持64位系统,不支持32位系统和压缩指针。

参数设置

类别配置选项说明
通用GC选项-XX:MinHeapSize 或 -Xms设置JVM堆的最小大小。
-XX:InitialHeapSize设置JVM堆的初始大小。
-XX:MaxHeapSize 或 -Xmx设置JVM堆的最大大小。
-XX:SoftMaxHeapSize设置堆大小的软限制,达到此值可能会触发GC。
-XX:ConcGCThreads设置并发垃圾收集的线程数量。
-XX:ParallelGCThreads设置并行垃圾收集的线程数量。
-XX:UseLargePages启用大页内存支持,提高内存分配效率。
ZGC特定选项-XX:+UnlockExperimentalVMOptions解锁实验性VM选项。
-XX:+UseZGC启用Z Garbage Collector。
-XX:ZAllocationSpikeTolerance设置分配峰值的容忍度。
-XX:ZCollectionInterval设置ZGC的垃圾收集间隔。
-XX:ZFragmentationLimit设置ZGC堆碎片的容忍度。
-XX:ZMarkStackSpaceLimit设置ZGC标记阶段堆栈空间的限制。
-XX:ZUncommit控制ZGC是否取消提交未使用的内存区域。
-XX:ZUncommitDelay设置ZGC取消提交内存的延迟时间。
ZGC诊断选项-XX:+UnlockDiagnosticVMOptions解锁诊断VM选项。
-XX:zStatisticsInterval设置ZGC统计信息输出的间隔。
-XX:ZVerifyForwarding启用ZGC转发指针的验证。
-XX:ZVerifyMarking启用ZGC标记阶段的验证。
-XX:ZVerifyobjects启用ZGC对象的验证。
-XX:ZVerifyRoots启用ZGC根对象的验证。
-XX:ZVerifyViews启用ZGC视图的验证。
-xx:zProactive启用ZGC的主动垃圾收集策略。
其他选项-XX:UseNUMA启用对非统一内存访问(NUMA)架构的支持。
-XX:UseTransparentHugePages启用透明大页内存支持。
-XX:SoftRefLRUPolicyMSPerMB设置软引用的LRU策略,与每MB内存相关的时间。
堆分配选项-XX:AllocateHeapAt控制JVM堆分配的内存地址。

请注意,某些配置选项可能需要根据具体的JVM实现和版本进行调整。在使用这些选项时应参考官方文档,并在生产环境中进行充分测试。

触发机制

  • 支持定时触发、预热触发、分配速率触发和主动触发。

小结

ZGC通过其创新的垃圾收集策略和技术,实现了在大堆内存上的低延迟垃圾收集,特别适用于对延迟敏感的大规模应用。随着JDK版本的更新,ZGC有望得到进一步的优化和性能提升。尽管存在一些局限性,ZGC的设计理念和实现技术为Java垃圾收集器的发展提供了新的方向。

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

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

相关文章

flask的基本使用1

【 一 】Flask介绍 python 界的web框架 -Django:大而全,使用率较高 :https://github.com/django/django -FastAPI:新项目选择使用它:https://github.com/tiangolo/fastapi -flask:公司一些小项目使用它&a…

如何提高软件APP质量的测试类型

如今,由于市场竞争非常激烈,移动应用质量至关重要。我们需要关注用户体验以及应用的性能。如果应用包含错误,应用评级就会下降,应用下载量也会下降。如果我们能使我们的应用没有错误,那么应用获得人气的机会就会增加。…

通过颜色传感器控制机械臂抓物体

目录 1 绪论 2整体设计方案 2.1 系统的介绍 2.2 抓取模块 2.2.1 机械臂的定义 2.2.2 机械臂的分类 2.2.3 机械臂的选用 2.3 颜色识别模块 2.3.1 颜色传感器识别原理 2.3.2 TCS3200简介 2.4 整体控制方案 3 颜色识别抓取系统的硬件设计 3.1 单片机选型及参数 3.2 系…

win11系统重装?正版系统Windows11安装重启!保姆级重装系统攻略!

随着科技的不断发展,Windows 11系统已经逐渐成为了众多电脑用户的新选择。然而,当当电脑出现严重故障、受到病毒攻击、软件冲突、系统升级失败、硬件更换或升级、系统性能下降或个性化需求等情况时,重装系统可能是一个有效的解决方案。本文将…

构建网络图 (JavaScript)

前序:在工作中难免有一些千奇百怪的需求,如果你遇到构建网络图,或者学习应对未来,请看这边文章,本文以代码为主。 网络图是数据可视化中实用而有效的工具,特别适用于说明复杂系统内的关系和连接。这些图表…

kaoYan-Composition

It is almost axiomatic(不证自明的、公理的) that cooperation can benefit us in many ways.First, cooperation can facilitate the communication between different people.Likewise, collaboration can offer us an opportunity to learn from eac…

mybatisplus的lambdaQuery()使用案例

一、常用 查询 // 方式一 条件是LearningLesson必须为LearningLessonServiceImpl的T LearningLesson lesson lambdaQuery().eq(LearningLesson::getUserId, userId).eq(LearningLesson::getStatus, LessonStatus.LEARNING.getValue()).orderByDesc(LearningLesson::getLates…

【十六】【QT开发应用】Menu菜单,contextMenuEvent,setContextMenuPolicy,addAction

在 Qt 框架中,QMenu 类用于创建和管理菜单。菜单是用户界面的一部分,可以包含多个选项或动作,用户可以选择这些选项来执行特定的功能。菜单通常显示在菜单栏、上下文菜单(右键菜单)或工具栏中。 基本用法 创建菜单对象…

深入解读一下 `com.google.android.material.appbar.CollapsingToolbarLayout`

简介 在现代 Android 应用中,提供流畅且美观的用户体验是非常重要的。CollapsingToolbarLayout 是 AndroidX库中 Material Components 的一部分,它提供了一种易于实现的可折叠工具栏效果,常用于提供视觉吸引力的标题栏和动画效果。 本文将详…

已解决Writing ‘modem_a‘FAILED (remote: ‘Operation not permitted‘

今天用可视化工具FastbootEnhance线刷,没有注意到日志报错,开机后黑屏,电脑能检测到是开机状态,电源键按下有声音。 排除线刷包问题,翻看FastbootEnhance的日志,它的日志放到记事本全屏方便观看&#xff0…

项目1111

中文显示姓名列和手机号 SELECT contact_name AS 姓名, contact_phone AS 手机号 FROM 2_公司id; 使用explain测试给出的查询语句,显示走了索引查询 EXPLAIN SELECT * FROM 7_订单数量 WHERE countid LIKE e%; 统计用户订单信息,查询所有用户的下单数量…

Prometheus中添加基本身份验证功能

在Prometheus中添加基本身份验证功能,可以按照以下步骤进行: 一、生成哈希密码 首先,需要安装bcrypt工具,用于生成哈希密码。这可以通过Python的bcrypt库来完成。如果未安装,可以使用pip进行安装。 创建一个Python脚…

Android性能优化——卡顿优化

文章目录 一、从XML到屏幕上的展示造成跳帧的因素有那些发现问题定位问题定位代码 一、从XML到屏幕上的展示 数据加载阶段 数据控制阶段 数据展示阶段 xml —> view onCreat —> 解析layout.xml resume —> view —> wms ViewRootImpl UI 绘制流程 :测…

计算机网络之数据通信原理

1.通信系统的基本组成 信源:信息的发出者; 信宿:信息的接收者; 载体:信息的传送通道; 变换器:将信息变换成载体上可传输的信号; 反变换器:将载体上传输的信号变换成信…

Java中网络安全的基础知识

Java中网络安全的基础知识 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在现代互联网应用中,网络安全是一个至关重要的话题。随着网络攻击和数据…

Java零基础-集合:TreeSet

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

SQL基础:掌握数据查询与操作的核心技能(四)

引言:数据操作的语言艺术 在前一章节《数据库与表的基本操作》中,我们深入了解了如何创建、管理数据库和表,构建了数据存储的基础框架。本章节,我们将深入探索SQL语言,它是数据库管理系统的通用语言,用于数…

SpringBoot集成Druid数据库连接池并配置可视化界面和监控慢SQL

pom.xml <!-- Druid 数据库连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.23</version></dependency>application.yml spring:jackson:date-…

明星周边物品交易购物系统

摘 要 随着明星文化的兴起和粉丝经济的蓬勃发展&#xff0c;明星周边产品的市场需求日益增长。明星周边物品包括各种与明星相关的商品&#xff0c;如T恤、海报、手办、签名照等&#xff0c;它们成为粉丝们表达对明星喜爱和支持的方式之一。通过“星光璀璨”来形象化地表达明星…

Flask的 preprocess_request

理解 Flask 类似框架中的 preprocess_request 方法 在 Flask 类似的 web 框架中&#xff0c;preprocess_request 方法是一个关键组件。它在请求被分派之前调用&#xff0c;用于执行一些预处理操作。让我们一步一步来理解这个方法的工作原理。 1. 方法概述 首先&#xff0c;我…