JVM G1垃圾回收器简介与常用配置

news2024/9/21 13:41:25

简介

G1 is a generational, incremental, parallel, mostly concurrent, stop-the-world, and evacuating garbage collector which
monitors pause-time goals in each of the stop-the-world pauses.

在内存空间划分上,G1将堆分为等大的一块区域(region),region是内存分配和垃圾回收的基本单位,其大小为2的幂,范围是 1 MB 到 32MB 之间,可通过-XX:G1HeapRegionSize=4M进行配置。

G1在逻辑上将堆分为年轻代和老年代两种逻辑类型,年轻代又包含 eden regionsurvivor region,所有新建的对象均创建在eden region中,在经过young gc后,对象被复制整理到survivor region中(年龄不够到老年代时);老年代包含可横跨多个region的 humongous区域。示意图如下:

在这里插入图片描述

G1 垃圾回收器包含两个阶段,G1会在这两个阶段循环:

  • Young-only phase: 首先年轻代执行Normal类型垃圾回收,并不断提升对象到老年代,当老年代占用达到the Initiating Heap
    Occupancy threshold后,G1开启Concurrent Start垃圾回收,这两个阶段不会STW,接下来的Remark和Clean动作真正执行清理工作,会STW
  • Space Reclamation phase: 该阶段包含多种 Mixed 垃圾回收(包含年轻代垃圾回收),会清理老年代对象。

作为兜底,如果G1发现堆内存不够用时会触发Full GC。

  • Remember Set : 当前Region使用 Remember Set 记录其他Region到当前Region的引用,当前Region发生GC时,这些引用需要更新指向。
  • Collection Set : 待回收Region集合

参考: Garbage-First Garbage Collector

参数配置

G1 GC需要配置参数:-XX:+UseG1GC 开启

堆内存配置

-Xms8G -Xmx8G -Xss512K -XX:+UnlockExperimentalVMOptions -XX:G1MaxNewSizePercent=40
配置说明建议
-Xms8G堆内存最小值一般为pod内存的80%
-Xmx8G堆内存最大值一般为pod内存的80%
-Xss512K线程栈大小,默认1M512K或1M
-XX:G1NewSizePercent=30年轻代占整个堆的比例最小值 (需开启-XX:+UnlockExperimentalVMOptions)对于启动pod时获取缓存的场景, 可适当调大, 减少启动阶段的频繁调整
-XX:G1MaxNewSizePercent=40年轻代占整个堆已使用的比例最大值 (需开启-XX:+UnlockExperimentalVMOptions)大堆建议调小阈值(>=32G), 降低单次年轻代回收的STW时间
-XX:G1HeapRegionSize=4MG1 Region的大小. 值是 2 的幂, 范围是 1 MB 到 32 MB 之间小堆且常态有持续大对象产生的场景, 可适当调大

GC配置

-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=50 -XX:MaxTenuringThreshold=10
配置说明建议
-XX:+UseG1GC开启G1垃圾回收
-XX:MaxGCPauseMillis=100预期GC STW时间,单位ms看场景,低时延的可配置到100ms以内,最大不超过500ms
-XX:InitiatingHeapOccupancyPercent=50触发GC标记周期的堆占用百分比大堆(>=32GB)时适当调大阈值, 减少标记触发
-XX:G1HeapWastePercent=10默认值 : 10% , 堆浪费百分比, 当G1发现可被回收的空间小于10%时, 就不会再进行混合收集, 也就是会结束当前的混合收集周期
-XX:G1OldCSetRegionThresholdPercent=10默认值 : 堆的5%, 设置混合垃圾回收期间要回收的最大旧区域数占整个堆的百分比
-XX:G1MixedGCLiveThresholdPercent=70默认值 : 65%, MixGC时, 年老代Region中存活对象百分比, 只有在此阈值下的Region才会被选入回收列表CSet (需开启-XX: +UnlockExperimentalVMOptions )大堆(>=32GB)时适当调大阈值, 增加扫描年老带Region的备选集合, 增加年老代回收效率
-XX:G1MixedGCCountTarget=8最多8次混合垃圾回收, 设置标记周期完成后, 对存活数据上限为 G1MixedGCLIveThresholdPercent 的旧区域执行混合垃圾回收的目标次数
-XX:MaxTenuringThreshold=n默认值15, 对象进入年老带前在Survivor区中的最大存活年龄survivor区过大时, 可以跟进GC Log分析分代存活分布, 适当调小阈值, 减轻复制压力, 让对象快速进入年老代,降低young gc压力.

NMT

-XX:NativeMemoryTracking=detail
配置说明建议
-XX:NativeMemoryTracking默认值 : 关闭 [summary/detail] , 用于堆外内存泄露分析

GC日志配置

// Java8:
-XX:+PrintGCCause -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy -XX:+PrintTenuringDistribution -XX:+PrintReferenceGC -XX:+PrintHeapAtGC -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M
// Java11以上:
-Xlog:gc*=info,phases*=debug,region*=debug,age*=trace,ergo*=debug,safepoint,heap*=debug:file=gc.log:time,level,tags:filecount=5,filesize=2m
配置说明建议
-XX:+PrintGCCause打印触发GC的原因默认开启
-XX:+PrintGCDetails打印GC各阶段详细日志默认开启
-XX:+PrintGCApplicationConcurrentTime打印GC并行处理时间不开启
-XX:+PrintGCApplicationStoppedTime打印GC STW时间默认开启
-XX:+PrintAdaptiveSizePolicy打印自适应分代调整信息默认开启
-XX:+PrintTenuringDistribution打印GC扫描存活对象年龄分布默认开启
-XX:+PrintReferenceGC打印引用GC处理详情默认开启
-XX:+PrintGCDateStamps打印GC绝对日期, 默认为从JVM开始的相对时间戳默认开启
-XX:+PrintGCTimeStamps打印GC绝对时间, 默认为从JVM开始的相对时间戳默认开启
-XX:+PrintHeapAtGC打印GC前后堆内存详情默认开启

其他

配置说明建议
-XX:-UseBiasedLocking默认值 : 偏向锁开启。当锁竞争不激烈时可以通过偏向来提高性能. 但是高并发的情况下, 偏向锁会经常失效, 取消偏向锁时, 需要获取每个线程使用锁的状态以及运行状态,该过程会STW
-XX:-OmitStackTraceInFastThrow默认值 : 开启同一位置不断抛出同样的Exception, JIT会丢弃原始堆栈和Message来提升性能. 无脑关闭

配置参考

规格实例配置参数
1C2G-Xmx1G -Xms1G -Xss256K -XX:MaxMetaspaceSize=320M -XX:MetaspaceSize=320M -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:ParallelGCThreads=1 -XX:ConcGCThreads=1 -XX:InitiatingHeapOccupancyPercent=50 -XX:-OmitStackTraceInFastThrow -XX:+ParallelRefProcEnabled -XX:+PrintGCDetails -XX:+PrintGCDateStamps
4C8G-Xmx6G -Xms6G -Xss512K -XX:MaxMetaspaceSize=320M -XX:MetaspaceSize=320M -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:ParallelGCThreads=4 -XX:ConcGCThreads=1 -XX:InitiatingHeapOccupancyPercent=50 -XX:-OmitStackTraceInFastThrow -XX:+ParallelRefProcEnabled -XX:+PrintGCDetails -XX:+PrintGCDateStamps
8C16G-Xmx12G -Xms12G -Xss512K -XX:MaxMetaspaceSize=320M -XX:MetaspaceSize=320M -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:ParallelGCThreads=8 -XX:ConcGCThreads=2 -XX:InitiatingHeapOccupancyPercent=40 -XX:-OmitStackTraceInFastThrow -XX:+ParallelRefProcEnabled -XX:+PrintGCDetails -XX:+PrintGCDateStamps

欢迎关注我的公众号:Java研发鲍同学

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

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

相关文章

手摸手系列之Linux下根据自己的jdk包构建docker镜像

项目在本地导出PDF文件正常,部署到Linux服务器docker容器中导出就报错,百撕不得姐,经查,docker依赖的openjdk版本是8u112版本,而我本地是8u421版本,那就升级jdk的小版本试试。 在docker的中央仓库[点我直达…

记录jenkins的一个错误

因为workspace 的权限多了一个s 导致构建镜像出现了失败 [rootsimetra-ecs-01 .jenkins]# ls -la | grep work -rw-r----- 1 root root 46 Aug 17 11:57 org.jenkinsci.plugins.workflow.flow.FlowExecutionList.xml drwxr-x--- 6 root root 4096 Aug 12 10:06 works…

【微信小程序】自定义组件 - 组件的生命周期

1. 组件全部的生命周期函数 2. 组件主要的生命周期函数 3. lifetimes 节点

OceanMind海睿思入选《2024中国企业数智化转型升级服务全景图/产业图谱》

近日,国内知名数据智能产业创新服务媒体数据猿携手上海大数据联盟发布了《2024中国企业数智化转型升级服务全景图/产业图谱1.0版》。中新赛克海睿思从数千家企业中脱颖而出,成功入选「底层技术服务 - 大数据」细分领域。 在历经数月的时间里,…

AI 代理参考架构

LLM Agent部署框架 围绕 ChatGPT 的讨论,现在已经演变为AI 代理。 图:AI代理平台参考架构 比尔盖茨最近设想(CNBC 采访:链接)未来我们将拥有一个能够处理和响应自然语言并完成许多不同任务的AI 代理。盖茨以计划旅行…

SD NAND的SD模式与SPI模式的初始化

最近很多客户朋友在询问我们CS创世 SD NAND能不能使用SPI接口,两者使用起来有何区别,下面为大家详细解答。 SD MODE: CS创世 SD NAND支持SD模式和SPI模式,SD NAND默认为SD模式,上电后,其初始化过程如下: …

陪跑案例 | 德国营养师吴迪:从胖妹逆袭塑形导师!公开首场发售秘籍

有目标,有心力的老师,一旦找对方法和团队,能够化解99%的问题。 今天,创客匠人【陪跑案例故事】专栏推出第四期内容,为大家介绍【梦想身型健康学院】平台创始人吴迪老师的陪跑故事。 吴迪老师是梦想身型训练营创始人、德…

Es-在java中使用

match_all match trem 范围查询 地理位置查询 算分函数 多条件bool查询 分页查询 高亮

mixly教程-ESP32接入文言一心

一、获取access_token 步骤一. 创建千帆应用 (1)登录百度智能云千帆控制台。 百度智能云-登录 (2)创建千帆应用 注意切换到旧版 (3)创建应用后,获取AppID、API Key、Secret Key。 步骤二. 服…

Leetcode 162.153.33 二分法 C++实现

Leetcode 162. 寻找峰值 问题:峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums ,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。你可以假设 nums[-1] num…

SpringBoot医疗废物管理系统 项目编号:200082(案例分析)

摘 要 随着医疗废物管理的重要性日益凸显,如何高效管理和处理医疗废物成为医疗机构面临的挑战。该系统涵盖存储间主管、运输员用户、处理地主管和管理员四个角色,旨在实现医废信息管理、出入库记录、运输信息跟踪、处理地信息管理等功能。通过技术手段…

警惕!“On Hold”期刊大变天!又3本被踢出WOS数据库,8月SCI/SSCI期刊目录更新!

【SciencePub学术】本期热点 WOS目录更新 又到了一月一度的科睿唯安官网更新Web of Science核心期刊目录的时候,小编今天带大家一起来看看最新的SCI/SSCI期刊目录有哪些变化吧。 来源:科睿唯安官网 继上次SCI期刊目录和SSCI期刊目录更新之后&#xff0c…

设计模式(单例模式、工厂模式、建造者模式、代理模式)

设计模式是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案(设计思想、设计经验)。 一、六大原则 1、单一职责原则&#…

[嵌入式 C 语言] 知识库

一、数据类型 1.1 基本数据类型 自定义类型基础类型占用字节数取值范围描述mls8char1-128 to 1278 位有符号整数mlu8unsigned char10 to 2558 位无符号整数mlvu8volatile unsigned char10 to 2558 位无符号整数,具有 volatile 属性mls16short2-32768 to 3276716 位…

TreeUtils 树工具类

数据展示: 如图:部门树数据 ,树形的基础数据 id 、 parentId 、label 便可形成 嵌套对象字段如下:{id: 103, parentId: 101, label: "研发部门", weight: 1} 一、工具类 继承了 hutoo 的工具类 TreeUtil &#xff08…

springboot+Quartz通过数据库控制定时任务执行与时间

前言 在我们的springboot项目中,有很多种实现定时任务的方式 有用最简单的 Scheduled 实现定时任务,即: import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;Component EnableScheduling p…

Arthas相关命令

官方网站:命令列表 | arthas 也可以用idea的插件arthas-idea的插件根据你想定位的代码生成命令 jvm 相关 dashboard - 当前系统的实时数据面板getstatic - 查看类的静态属性heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能jvm - 查看当前 JVM 的信息l…

Studying-刷题补充| 数组:58.区间和、44. 开发商购买土地

目录 58.区间和 44. 开发商购买土地 总结 58.区间和 文档讲解:代码随想录58.区间和 题目:58. 区间和(第九期模拟笔试) (kamacoder.com) 学习:本题最直接的做法是,将数组Array保存好后,通过…

linux - mathematica 安装教程

注意事项: 文件目录不能有空格,不能有中文 安装包 Mathematica - 12.1 安装 解压软件包 7z x Mathematica_12.1.1_LINUX_CN.zip运行安装器 命令运行后解压出Mathematica_12.1.1_LINUX_CN.sh, 运行该安装脚本 chmod x Mathematica_12.1.1_LINUX_CN…

STM32后备区域:读写BKP备份寄存器与使用RTC实时时钟详解

目录 STM32后备区域:读写BKP备份寄存器与使用RTC实时时钟详解 1 什么是STM32的后备区域 分割线* 2.1 BKP备份寄存器简介 2.2 BKP备份寄存器基本结构 2.3 BKP外设头文件 bkp.h介绍 2.4 读写 BKP备份寄存器 操作步骤 2.5 编写 读写备份寄存器 5.1 文件介绍 …