基于JDK17的GC调优策略

目录

1 JVM有哪些参数可以调

1.1 标准参数

1.2 非标准参数

1.3 不稳定参数

2 从开源框架学习GC调优

3 基于JDK17优化JVM内存布局

3.1 定制堆内存大小

3.2 设置非堆空间

3.2.1 设置元空间

3.2.2 设置线程栈空间

3.2.3 设置热点代码缓存空间

3.2.4 应用程序类数据分享

4 基于JDK17定时JVM的GC参数

4.1 G1 gc参数

4.2 ZGC gc参数

5 GC日志处理


参考资料:

JDK工具官网文档

Java Development Kit Version 17 Tool Specifications

JDK17 java指令官网文档

The java Command

JDK8 java指令官网文档

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

1 JVM有哪些参数可以调
1.1 标准参数
  • -开头所有HotSpot都支持
  • 使用java -help或者java -?查看
  • 常用标准参数
    • --list-modules查看当前Java进程模块
    • --show-module-resolution查看当前Java进程各个模块依赖关系
    • -verbose:class显示加载信息
    • -verbose:gc显示GC事件
1.2 非标准参数
  • -X开头特定HotSpot版本支持指令
  • 使用java -X查看
  • 这类参数一般比较稳定除非重大版本升级一般不会太大变化
  • 常用非标准参数
    • -Xms空间大小
    • -Xmx堆空间最大大小
    • -Xint采用解释执行
    • -Xcomp:采用编译执行
    • -Xmixed两种执行引擎混合方式执行

1.3 不稳定参数
  • -XX开头此类参数数量最多
  • 这些参数特定HotSpot版本对应容易变动
  • 查看最终生效不稳定指令 java -XX:+PrintFlagsFinal -version
  • 查看默认不稳定指令java -XX:+PrintFlagsInitial -version
  • 当前命令不稳定指令java -XX:+PrintCommandLineFlags -version

  • 对于数值类型参数通过 -XX:参数=设置
  • 对于Boolean类型参数通过 -XX:+/-参数设置+代表开启-代表关闭

2 从开源框架学习GC调优
  • 可以观察一些开源java中间件服务启动JVM参数如何调整
  • 从而调制自己系统特有JVM参数
  • 整体分为如下三方面
    • 调整内存布局
    • 选择具体GC垃圾回收器并定制少部分GC参数
    • 打印GC日志
3 基于JDK17优化JVM内存布局
  • jvm整体内存布局如下

  • 堆区JVM管理内存最大一块只要用于存放各种对象实例GC活动主要区域
  • 内存管理方式由于垃圾回收器不同从而很大差距
3.1 定制堆内存大小
  • 堆内存大小决定JAVA程序执行性能
  • 更大内存存下更多对象但是随之带来GC线程压力

堆内存的主要参数

  • -Xms堆内存初始大小
    • 默认单位bytes必须为1024整数并且大于1M
    • 数据后面可以内存单位KBMBGB
    • 如果不设置该值JVM默认内存初始大小设置老年代年轻内存之和
    • 通过参数-XX:InitalHeapSize设置
  • -Xmx设置堆内存最大大小
    • 默认值运行操作系统位数以及物理内存大小自行决定
    • 也可通过参数-XX:MaxHeapSize设置
  • 通常部署服务最大内存初始内存设置相同避免jvm在运行过程内存动态伸缩性能损耗
  • -XX:MinHeapFreeRatioGC后所允许的堆空间的最⼩比例。如果剩余的堆空间降落到这个阈值之下,这时堆空间就会启动⼀次扩充。
  • -XX:MinHeapSizeGC后所允许的堆空间的最⼩。如果剩余的堆空间降落到这个阈值之下,这时堆空间就会启动⼀次扩充。
3.2 设置非堆空间
3.2.1 设置元空间
  • MetaSpace元空间主要存储是类元信息运行常量池方法字节码
  • 类的元信息包括结构信息如字段方法注释
  • MetaSpace直接使用本地内存
  • -XX:MetaspaceSize元空间大小
    • 元空间使用大小超过阈值时就会触发一次GC
    • 后续运行过程触发GC阈值根据空间使用情况自动调整
  • -XX:MaxMetaspaceSize元空间最大值
    • 设置元空间大小最大值默认元空间无限
    • 元空间大小取决于应用本身以及操作系统可提供内存大小
    • 元空间数据大小应该经常发生变动
3.2.2 设置线程栈空间
  • JAVA进程在运行每一个线程开辟一块内存用来执行线程对应指令
  • 线程中执行每一个方法对应空间一个方法
  • 方法主要包含了程序计数器操作数局部变量返回地址几个标准部分
  • 另外具体虚拟机实现还会添加一些附加信息例如HotSpot添加了动态链接库以及一些自定义附加信息
  • 线程空间随着方法结束释放
  • -Xss设置线程空间大小
    • LinuxMacOS系统默认值1MBWindows根据配置虚拟内存大小决定
    • 也可通过参数-XX:ThreadStackSize配置

3.2.3 设置热点代码缓存空间
  • java-server表示JVM服务器模式运行
  • 服务器模式下HotSpot虚拟机执行频率热点代码识别出来
  • 提前进行编译并将编译结果缓存后续执行编译方式直接执行编译好的代码

  • -XX:InitialCodeCacheSIze=size设置代码缓存空间初始大小
  • -XX:ReservedCodeSize=size设置代码缓存空间最大大小
    • 默认值240MB
    • 禁止提前编译时(-XX:-TiereadCompilation)默认值48MB
  • -XX:+SegmentedCodeCache启用代码缓存分割
    • jdk17新增参数主要作用优化代码缓存空间内存使用
    • 开启参数需要启用提前编译-XX:+TieredCompilation并且-XX:ReservedCodeCacheSIze >= 240MB
3.2.4 应用程序类数据分享
  • Application Class Data Sharing(应用程序列数据共享)
  • 旨在提高运行相同代码多个JVM启动时间并减少他们内存占用一种优化机制
  • JVM第一次启动加载数据收集归档指定文件
  • 之后JVM启动优先文件加载可以节省JVM初始化过程中时间资源
#信息归档hello.jsa文件
java -Xshare:dump -XX:SharedArchiveFile=hello.jsa -version
#使用归档文件启动并打印加载日志
java -XX:SharedArchiveFile=hello.jsa -Xlog:class+load -version

  • 归档信息

  • 启动JVM读取归档文件

4 基于JDK17定时JVM的GC参数
4.1 G1 gc参数
  • G1内存模型

  • G1 GC一种分代并发基于区域垃圾回收器
  • G1内存划分为多个独立区域Region)
  • 每个Region可以EdenSurvivor或者Old并且每个Region属于哪个分代随着GC变化
  • 为了保证系统响应G1 GC尽量达到用户设定停顿时间目标进行垃圾回收
  • 目标停顿时间参数-XX:MaxGCPauseMillis设置默认200ms

G1 gc的核心参数

  • -XX:UseG1GC:启用g1
  • -Xmx内存大小
  • -XX:MaxGCPauseMillils期望G1达到最大停顿时间默认200ms
  • -XX:G1HeapRegionSize=size设置每个region大小
    • 必须2N次幂并且范围1MB~32MB之间
    • 默认=内存大小/2048
    • 较大Region区域可以减少GC频率但是影响单次GC耗时
  • -XX:G1ReservePercent=percent
    • 预留多少比例堆空间作为空闲避免内存突增从而发生OOM问题
    • 默认值10%
  • -XX:InitiatingHeapOccupancyPercent=precent
    • 默认值45
    • region使用达到阈值G1就会开始并发标记周期
  • -XX:+/-G1UseAdaptivelHOP是否自动调整触发GC阈值
    • 开启前面几次gc会按照预设阈值触发gc后续根据系统运行情况动态调整该值
  • -XX:G1AdaptiveIHOPNumInitialSamples表示根据预设阈值触发gc次数
    • 默认3
  • -XX:ParallelGCThreads=num设置gc工作线程
    • 默认值取决CPU核心数
  • -XX:G1HeapWastePercent=percent设置空间浪费比例
    • HotSpot空间使用比例低于这个不会启动GC
    • 默认值5%
  • -XX:G1OldSetRegionThresholdPercent=percent
    • 设置一次混合GC需要经历old内存比例
    • 默认堆空间10%
    • 调大该值降低gc执行频率但是延长每一次gc执行时间
  • -XX:G1MixedGCCountTarget=number
    • 设置G1垃圾回收器线程上限
    • HotSpot为了达到清理目标内存比例目的自动计算需要启动G1回收器但是上限不会超过
    • 默认8
4.2 ZGC gc参数
  • ZGC设计会根据运行环境自适应调整运行参数
  • 因此只需要启用ZGC并且指定大小即可
5 GC日志处理
  • 配置打印gc日志
-Xlog:gc*:file=${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log:time,tags:filecount=5,filesize=30M
  • gc日志分析平台

Universal JVM GC analyzer - Java Garbage collection log analysis made easy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值