JVM 内存参数调优详解

embedded/2025/4/1 8:00:55/

1. ​堆内存控制

-Xms4g                  # 初始堆内存大小(JVM 启动时分配的堆内存)
-Xmx4g                  # 最大堆内存大小(JVM 堆内存的上限)
详细说明
  • 作用
    • -Xms(Initial Heap Size):JVM ​启动时分配的堆内存初始值。
    • -Xmx(Max Heap Size):JVM 堆内存的上限,当堆内存使用超过此值时,触发 OOM。
  • 默认值
    • 不同 JVM 版本默认值不同,通常 -Xms 为物理内存的 1/64,-Xmx 为 1/4。
  • 调优建议
    • 必须设置 -Xms 和 -Xmx 为相同值,避免堆内存动态扩容导致性能抖动。
    • 示例:-Xms4g -Xmx4g 表示堆内存固定为 4GB。
  • 原理
    • 如果 -Xms < -Xmx,JVM 会根据堆内存使用情况动态调整大小,但扩容时会触发 Full GC,导致请求延迟波动。

2. ​元空间(Metaspace)控制

-XX:MetaspaceSize=256m     # 元空间初始大小
-XX:MaxMetaspaceSize=512m  # 元空间最大大小
详细说明
  • 作用
    • MetaspaceSize:元空间的初始大小​(类似 -Xms)。
    • MaxMetaspaceSize:元空间的上限​(类似 -Xmx)。
  • 默认值
    • MetaspaceSize 默认约 20MB,MaxMetaspaceSize 默认无限制(受物理内存限制)。
  • 调优建议
    • 必须设置 MaxMetaspaceSize,防止类加载器泄漏导致元空间无限增长。
    • 示例:-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
  • 原理
    • 元空间用于存储类元数据​(如类名、方法签名、字段描述符等)。
    • 如果应用动态生成大量类(如反射、动态代理),未限制 MaxMetaspaceSize 会导致 OOM: Metaspace。

3. ​直接内存(堆外内存)控制

-XX:MaxDirectMemorySize=1g  # 堆外内存(Direct Buffer)上限
详细说明
  • 作用
    • 限制通过 ByteBuffer.allocateDirect() 分配的堆外内存大小。
  • 默认值
    • 默认与 -Xmx 相同(即堆内存上限)。
  • 调优建议
    • 如果使用 NIO(如 Netty、Kafka 客户端),需显式设置此参数。
    • 示例:-XX:MaxDirectMemorySize=1g 表示堆外内存最多 1GB。
  • 原理
    • 堆外内存不经过 JVM 堆,直接由操作系统管理,但分配过多会导致 OOM: Direct buffer memory。

4. ​线程栈大小控制

-Xss256k                # 每个线程的栈内存大小
详细说明
  • 作用
    • 控制每个线程的栈内存大小(存储局部变量、方法调用栈)。
  • 默认值
    • JDK 8 默认 1MB(Linux/x64),不同操作系统和架构可能不同。
  • 调优建议
    • 高并发场景下,建议降低此值(如 -Xss256k),防止创建过多线程导致 OOM: Unable to create new native thread。
    • 如果应用有深度递归调用,需适当增大此值。
  • 原理
    • 栈内存过大会限制可创建的线程数。例如,默认 1MB 栈内存 + 1GB 堆内存,最多只能创建约 1000 个线程。

5. ​GC 日志与内存溢出自动转储

-XX:+HeapDumpOnOutOfMemoryError       # OOM 时自动生成堆转储文件
-XX:HeapDumpPath=/path/to/dumps       # 堆转储文件存储路径
-XX:+PrintGCDetails                   # 打印 GC 详细日志
-XX:+PrintGCDateStamps                # 打印 GC 发生的时间戳
-Xloggc:/path/to/gc.log               # GC 日志文件路径
详细说明
  • 作用
    • HeapDumpOnOutOfMemoryError:OOM 时自动生成 Heap Dump 文件(用于 MAT 分析)。
    • PrintGCDetails:记录 GC 的详细过程(如 Young GC、Full GC 耗时)。
  • 调优建议
    • 生产环境必须开启这些参数,用于事后排查内存问题。
  • 原理
    • GC 日志可分析内存回收效率,例如频繁 Full GC 可能表示堆内存不足或存在内存泄漏。

6. ​完整 JVM 参数示例

# 堆内存(核心参数)
-Xms4g -Xmx4g # 元空间(类元数据)
-XX:MetaspaceSize=256m 
-XX:MaxMetaspaceSize=512m # 堆外内存(NIO 直接内存)
-XX:MaxDirectMemorySize=1g # 线程栈
-Xss256k # GC 日志与故障诊断
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/logs/heapdump.hprof 
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps 
-Xloggc:/logs/gc.log # 其他优化
-XX:+UseG1GC             # 启用 G1 垃圾回收器(高吞吐、低延迟)
-XX:MaxGCPauseMillis=200 # 目标 GC 暂停时间(单位:毫秒)

三、参数调优原则

  1. 根据应用类型调整
    • Web 服务:堆内存占比高(如 70% 物理内存),直接内存按需分配。
    • 大数据计算:堆外内存可能占比更高(如 Spark 的 Off-Heap Memory)。
  2. 监控验证
    • 使用 jstat -gc <PID> 或 Prometheus + Grafana 监控内存使用和 GC 频率。
  3. 压测验证
    • 通过 JMeter 或 Gatling 模拟高并发,观察内存增长和 GC 行为。

四、总结

  • 核心参数-Xms-XmxMaxMetaspaceSizeMaxDirectMemorySize
  • 诊断参数HeapDumpOnOutOfMemoryErrorPrintGCDetails
  • 调优目标:避免内存浪费,防止 OOM,平衡吞吐量和延迟。

http://www.ppmy.cn/embedded/176849.html

相关文章

APL语言的压力测试

APL语言的压力测试&#xff1a;探索极限与性能挑战 引言 APL&#xff08;A Programming Language&#xff09;是一种用于数组处理的编程语言&#xff0c;它以其简洁的语法和强大的数组操作能力广受欢迎。由于其独特的表达方式&#xff0c;APL在金融、工程和科学计算等领域被广…

贪心算法 力扣hot100热门面试算法题 面试基础 核心思路 背题

贪心算法 买卖股票的最佳时机 https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/ 核心思路 如果假设今日买入&#xff0c;未来最高点是未知的&#xff0c;需要遍历后续数组&#xff0c;所以时间复杂度变成n^2&#xff1b; 那么如果假设今日卖出&#xff0c;遍…

诡异的服务重启原因探索

背景 同事做了一个订单导出功能,大约15万的数据量,使用golang语言开发,使用了ShardingSphere分表组件,通过多协程并行把15万的数据一次性读到内存,写excel并上传阿里OSS。 在本地测试没有发生什么异常的情况。部署到服务器,执行导出功能程序就会自动重启。 探索过程 …

Kafka是如何实现幂等性的??

Kafka通过幂等生产者&#xff08;Idempotent Producer&#xff09;机制来实现消息的幂等性&#xff0c;确保每条消息在Kafka中只被处理一次&#xff0c;即使在生产者重试发送的情况下也不会导致重复消息。以下是Kafka实现幂等性的详细说明&#xff1a; 1. 幂等生产者的基本概念…

【Linux-驱动开发-驱动分类】

Linux-驱动开发-驱动分类 ■ Linux-驱动分类■ Linux-字符设备■ 字符设备-注册与注销函数■ 字符设备-具体操作函数■ 字符设备-LICENSE 和作者信息■ 示例一&#xff1a;■ 示例一&#xff1a; 寄存器物理地址映射■ 新字符设备驱动■ 示例一&#xff1a;新字符设备驱动 ■ L…

单片机中C++的局部static变量的初始化仍然遵循控制流

实验 执行如下测试代码 class Test { public:Test(){bsp::di::Console().WriteLine("构造");} };void test_func() {bsp::di::Console().WriteLine("第一条语句");static Test test; }执行两次 test_func &#xff0c;在串口观察输出 可以看到 static …

基于STC89C51的太阳自动跟踪系统的设计与实现—单片机控制步进电机实现太阳跟踪控制(仿真+程序+原理图+PCB+文档)

摘 要 随着我国经济的飞速发展&#xff0c;促使各种能源使用入不敷出&#xff0c;尤其是最主要的能源&#xff0c;煤炭石油资源不断消耗与短缺&#xff0c;因此人类寻找其他替代能源的脚步正在加快。而太阳能则具有无污染﹑可再生﹑储量大等优点&#xff0c;且分布范围广&…

TDengine 3.3.2.0 集群报错 Post “http://buildkitsandbox:6041/rest/sql“

原因&#xff1a; 初始化时处于内网环境下&#xff0c;Post “http://buildkitsandbox:6041/rest/sql“ 无法访问 修复&#xff1a; vi /etc/hosts将buildkitsandbox映射为本机节点 外网环境下初始化时没有该问题