一、基础内存参数
1.1 堆内存配置
bash
# 设置初始堆大小(常用配置:Xms = Xmx 避免动态调整)
-Xms2g
# 设置最大堆大小(生产环境通常设为物理内存的1/4~1/2)
-Xmx4g
# 设置年轻代大小(老年代 = 堆 - 年轻代)
-Xmn1g
# 设置元空间大小(取代永久代)
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
1.2 栈内存配置
bash
# 设置线程栈大小(默认1MB,可根据线程数调整)
-Xss256k
二、垃圾回收参数
2.1 通用GC参数
bash
# 打印GC日志
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintHeapAtGC
-verbose:gc
# GC日志文件输出
-Xloggc:/app/logs/gc-%t.log
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=100M
2.2 G1收集器(JDK9+默认)
bash
# 启用G1收集器
-XX:+UseG1GC
# 目标暂停时间(毫秒)
-XX:MaxGCPauseMillis=200
# 并行GC线程数
-XX:ParallelGCThreads=4
# 并发GC线程数
-XX:ConcGCThreads=2
# 年轻代初始比例(占堆的百分比)
-XX:G1NewSizePercent=5
-XX:G1MaxNewSizePercent=60
2.3 CMS收集器(JDK8及之前)
bash
# 启用CMS收集器
-XX:+UseConcMarkSweepGC
# CMS触发阈值(老年代使用率)
-XX:CMSInitiatingOccupancyFraction=75
# Full GC前开启CMS
-XX:+UseCMSInitiatingOccupancyOnly
# 开启压缩减少碎片
-XX:+UseCMSCompactAtFullCollection
三、性能调优参数
3.1 编译器优化
bash
# 服务端模式(默认开启)
-server
# 分层编译(JDK7+默认)
-XX:+TieredCompilation
# 代码缓存大小
-XX:ReservedCodeCacheSize=256m
-XX:InitialCodeCacheSize=64m
# 方法内联控制
-XX:MaxInlineSize=35
-XX:FreqInlineSize=325
3.2 内存与对象管理
bash
# 直接内存大小
-XX:MaxDirectMemorySize=1g
# 大对象阈值(直接进入老年代)
-XX:PretenureSizeThreshold=1m
# 对象年龄阈值(进入老年代的次数)
-XX:MaxTenuringThreshold=15
# 逃逸分析
-XX:+DoEscapeAnalysis
# 标量替换
-XX:+EliminateAllocations
四、监控与诊断参数
4.1 异常处理
bash
# 内存溢出时生成堆转储
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/app/dumps/heapdump.hprof
# 错误日志文件
-XX:ErrorFile=/app/logs/java_error_%p.log
# 永久代溢出时转储(JDK7及之前)
-XX:+HeapDumpOnOutOfPermGenError
4.2 JMX监控
bash
# 开启JMX远程监控
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9090
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=192.168.1.100
4.3 飞行记录(Flight Recorder)
bash
# 启用JFR(Java Flight Recorder)
-XX:+FlightRecorder
# JFR启动参数
-XX:StartFlightRecording=duration=60s,filename=/app/recording.jfr
五、实际业务场景配置
5.1 Web应用(Tomcat/Spring Boot)
bash
#!/bin/bash
JAVA_OPTS="
# 基础配置
-server
-Xms4g
-Xmx4g
-Xmn2g
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
# GC配置
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+ParallelRefProcEnabled
-XX:+DisableExplicitGC
# 日志配置
-Xloggc:/app/logs/gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintHeapAtGC
-XX:+PrintTenuringDistribution
# 监控与诊断
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/app/dumps/
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9090
# 应用特定配置
-Dspring.profiles.active=prod
-Dfile.encoding=UTF-8
-Duser.timezone=Asia/Shanghai
"
java $JAVA_OPTS -jar app.jar
5.2 大数据处理(Spark/Flink)
bash
JAVA_OPTS="
-Xmx16g
-Xms16g
-Xmn8g
-XX:MaxDirectMemorySize=2g
# 大堆内存优化
-XX:+UseG1GC
-XX:InitiatingHeapOccupancyPercent=35
-XX:G1HeapRegionSize=16m
# 大内存页支持(需要操作系统配置)
-XX:+UseLargePages
-XX:LargePageSizeInBytes=2m
# 压缩指针(堆>32GB时需要关闭)
-XX:+UseCompressedOops
-XX:+UseCompressedClassPointers
# 网络与序列化优化
-Dio.netty.tryReflectionSetAccessible=true
-Dio.netty.allocator.type=pooled
"
export JAVA_OPTS
5.3 微服务容器化部署(Docker/K8s)
bash
# Dockerfile或K8s配置中的Java参数
JAVA_TOOL_OPTIONS="
# 容器感知
-XX:+UseContainerSupport
-XX:InitialRAMPercentage=70.0
-XX:MaxRAMPercentage=80.0
-XX:MinRAMPercentage=50.0
# 资源限制感知
-XX:ActiveProcessorCount=4
-XX:CICompilerCount=2
# 快速启动优化
-XX:+TieredCompilation
-XX:TieredStopAtLevel=1
# 诊断简化
-XX:+PerfDisableSharedMem
-XX:+UseSerialGC # 小内存容器推荐
"
5.4 高并发交易系统
bash
JAVA_OPTS="
# 低延迟GC配置
-XX:+UseZGC # JDK11+ 或
-XX:+UseShenandoahGC
# ZGC特定配置
-XX:ZAllocationSpikeTolerance=4.0
-XX:ZCollectionInterval=5
# 线程配置
-XX:ConcGCThreads=4
-XX:ParallelGCThreads=8
# 实时性保证
-XX:+UnlockExperimentalVMOptions
-XX:+UseCriticalJavaThreadPriority
# 内存屏障优化
-XX:+UseCondCardMark
"
# 或者使用Shenandoah
JAVA_OPTS="
-XX:+UseShenandoahGC
-XX:ShenandoahGCMode=iu
-XX:ShenandoahGuaranteedGCInterval=10000
"
六、调优建议与最佳实践
6.1 通用建议
-
堆大小设置:
-
Xms和Xmx设置相同,避免动态调整
-
年轻代占堆的1/3 ~ 1/2
-
保留20-30%内存给操作系统和其他进程
-
-
GC选择:
-
小内存(<8G):Serial或Parallel GC
-
中等内存(8G-32G):G1 GC
-
大内存(>32G)低延迟:ZGC或Shenandoah
-
-
监控指标:
-
GC停顿时间 < 200ms
-
Full GC频率 < 1次/天
-
CPU使用率 < 70%
-
6.2 问题排查命令
bash
# 查看当前JVM参数
jcmd <pid> VM.flags
# 查看GC情况
jstat -gc <pid> 1000 10
# 堆内存分析
jmap -heap <pid>
jmap -dump:live,format=b,file=heap.hprof <pid>
# 线程分析
jstack <pid> > thread.dump
6.3 配置检查清单
-
是否设置了合适的堆大小
-
是否配置了GC日志
-
是否配置了OOM时的堆转储
-
是否考虑了容器环境
-
是否根据业务特点选择了合适的GC
-
是否设置了正确的字符集和时区
这个配置指南涵盖了从基础到高级的Java运行参数,可根据具体业务场景进行调整。建议在生产环境部署前进行充分的压力测试和性能调优。