JAVA常见的 JVM 参数及其典型默认值

在 Java 线上应用中,JVM 参数的默认值取决于具体的 JVM 实现(如 Oracle JDK、OpenJDK、Zulu 等)、版本(如 Java 8、11、17 等)以及运行环境(物理机、容器等)。以下是常见的 JVM 参数及其典型默认值(以 OpenJDK 8/11 为例):


1. 堆内存相关参数

参数 默认值 说明
-Xms 物理内存的 1/64 初始堆大小(最小堆内存)
-Xmx 物理内存的 1/4 最大堆内存
-XX:NewRatio 2 新生代与老年代的比例(1:2
-XX:SurvivorRatio 8 Eden 区与单个 Survivor 区的比例(8:1:1
-XX:MaxTenuringThreshold 15 对象晋升老年代的年龄阈值(CMS 下可能为 6
-XX:InitialSurvivorRatio 8 初始 Survivor 区比例

2. 垃圾回收器(GC)相关参数

不同版本的默认 GC 不同:

  • Java 8 : 默认 Parallel GC (-XX:+UseParallelGC)

  • Java 9+ : 默认 G1 GC (-XX:+UseG1GC)

常见 GC 参数:

参数 默认值 说明
-XX:+UseSerialGC 关闭 使用 Serial GC(单线程)
-XX:+UseParallelGC Java 8 默认开启 并行 GC
-XX:+UseConcMarkSweepGC 关闭 CMS GC(Java 14 已废弃)
-XX:+UseG1GC Java 9+ 默认开启 G1 GC
-XX:MaxGCPauseMillis 200 ms(G1) 目标最大 GC 暂停时间
-XX:G1HeapRegionSize 根据堆大小自动计算 G1 的 Region 大小

3. 元空间(Metaspace)参数

Java 8 移除了永久代(PermGen),改用元空间:

参数 默认值 说明
-XX:MetaspaceSize 20.8 MB(平台相关) 初始元空间大小
-XX:MaxMetaspaceSize 无限制(受物理内存限制) 最大元空间大小
-XX:CompressedClassSpaceSize 1 GB(64 位 JVM) 压缩类指针空间大小

4. 性能优化参数

参数 默认值 说明
-XX:+UseCompressedOops 开启(64 位 JVM) 压缩对象指针
-XX:CICompilerCount 根据 CPU 核数 JIT 编译器线程数
-XX:ParallelGCThreads CPU 核数 并行 GC 线程数
-XX:ConcGCThreads ≈ ParallelGCThreads / 4 并发 GC 线程数(如 G1)

5. 其他重要参数

参数 默认值 说明
-XX:+HeapDumpOnOutOfMemoryError 关闭 OOM 时生成堆转储文件
-XX:HeapDumpPath ./java_pid<pid>.hprof 堆转储文件路径
-XX:+PrintGCDetails 关闭 打印详细 GC 日志
-Xloggc:<file> 关闭 将 GC 日志输出到文件
-XX:+DisableExplicitGC 关闭 禁止显式调用 System.gc()

查看默认值的方法

  1. 打印所有 JVM 参数默认值

    bash 复制代码
    java -XX:+PrintFlagsFinal -version

    输出中 := 表示修改后的值,= 表示默认值。

  2. 容器环境注意事项

    JVM 默认根据物理机内存计算堆大小(而非容器限制),需显式设置 -Xmx 或使用 -XX:+UseContainerSupport(Java 8u191+ 支持)。


线上建议配置示例(Java 8 为例)

bash 复制代码
# 基础配置
-Xms4g -Xmx4g             # 堆内存固定,避免动态调整
-XX:MetaspaceSize=256m    # 避免元空间动态扩容
-XX:+UseG1GC              # 使用 G1 GC(低延迟场景)
-XX:MaxGCPauseMillis=200  # 目标暂停时间

# 故障排查
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/path/to/dumps
-XX:ErrorFile=/path/to/hs_err_pid%p.log

# GC 日志
-Xloggc:/path/to/gc.log 
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps

注意事项

  1. 版本差异:不同 JDK 版本的默认值和推荐参数可能不同。

  2. 容器化部署 :需结合 -XX:+UseContainerSupport-XX:MaxRAMPercentage 等参数适配容器内存限制。

  3. 监控与调优:根据实际应用负载和监控数据(如 GC 暂停时间、吞吐量、内存使用率)调整参数。

建议通过工具(如 VisualVM、Grafana + Prometheus)持续监控 JVM 状态,结合压力测试验证配置合理性。

相关推荐
普兰店拉马努金2 分钟前
【高中数学/古典概率】4红2黑六选二,求取出两次都是红球的概率
java·概率
智商低情商凑2 分钟前
CAS(Compare And Swap)
java·jvm·面试
yangmf20403 分钟前
使用 Logstash 迁移 MongoDB 数据到 Easysearch
java·elasticsearch·搜索引擎
爱编程的鱼5 分钟前
C# 结构(Struct)
开发语言·人工智能·算法·c#
Tiger_shl6 分钟前
【Python语言基础】24、并发编程
java·数据库·python
FAQEW9 分钟前
Spring boot 中的IOC容器对Bean的管理
java·spring boot·后端·bean·ioc容器
05091515 分钟前
测试基础笔记第十一天
java·数据库·笔记
只可远观17 分钟前
Flutter Dart 循环语句 for while do..while break、continue
开发语言·javascript·ecmascript
IDRSolutions_CN43 分钟前
如何将 PDF 中的文本提取为 JSON 格式
java·经验分享·pdf·软件工程·团队开发
摘星编程1 小时前
并发设计模式实战系列(6):读写锁
java·设计模式·并发编程