一、基础内存参数
1.1 堆内存配置
# 设置初始堆大小(常用配置:Xms = Xmx 避免动态调整) -Xms2g # 设置最大堆大小(生产环境通常设为物理内存的1/4~1/2) -Xmx4g # 设置年轻代大小(老年代 = 堆 - 年轻代) -Xmn1g # 设置元空间大小(取代永久代) -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m1.2 栈内存配置
# 设置线程栈大小(默认1MB,可根据线程数调整) -Xss256k二、垃圾回收参数
2.1 通用GC参数
# 打印GC日志 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -verbose:gc # GC日志文件输出 -Xloggc:/app/logs/gc-%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M2.2 G1收集器(JDK9+默认)
# 启用G1收集器 -XX:+UseG1GC # 目标暂停时间(毫秒) -XX:MaxGCPauseMillis=200 # 并行GC线程数 -XX:ParallelGCThreads=4 # 并发GC线程数 -XX:ConcGCThreads=2 # 年轻代初始比例(占堆的百分比) -XX:G1NewSizePercent=5 -XX:G1MaxNewSizePercent=602.3 CMS收集器(JDK8及之前)
# 启用CMS收集器 -XX:+UseConcMarkSweepGC # CMS触发阈值(老年代使用率) -XX:CMSInitiatingOccupancyFraction=75 # Full GC前开启CMS -XX:+UseCMSInitiatingOccupancyOnly # 开启压缩减少碎片 -XX:+UseCMSCompactAtFullCollection三、性能调优参数
3.1 编译器优化
# 服务端模式(默认开启) -server # 分层编译(JDK7+默认) -XX:+TieredCompilation # 代码缓存大小 -XX:ReservedCodeCacheSize=256m -XX:InitialCodeCacheSize=64m # 方法内联控制 -XX:MaxInlineSize=35 -XX:FreqInlineSize=3253.2 内存与对象管理
# 直接内存大小 -XX:MaxDirectMemorySize=1g # 大对象阈值(直接进入老年代) -XX:PretenureSizeThreshold=1m # 对象年龄阈值(进入老年代的次数) -XX:MaxTenuringThreshold=15 # 逃逸分析 -XX:+DoEscapeAnalysis # 标量替换 -XX:+EliminateAllocations四、监控与诊断参数
4.1 异常处理
# 内存溢出时生成堆转储 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/dumps/heapdump.hprof # 错误日志文件 -XX:ErrorFile=/app/logs/java_error_%p.log # 永久代溢出时转储(JDK7及之前) -XX:+HeapDumpOnOutOfPermGenError4.2 JMX监控
# 开启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.1004.3 飞行记录(Flight Recorder)
# 启用JFR(Java Flight Recorder) -XX:+FlightRecorder # JFR启动参数 -XX:StartFlightRecording=duration=60s,filename=/app/recording.jfr五、实际业务场景配置
5.1 Web应用(Tomcat/Spring Boot)
#!/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.jar5.2 大数据处理(Spark/Flink)
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_OPTS5.3 微服务容器化部署(Docker/K8s)
# 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 高并发交易系统
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 问题排查命令
# 查看当前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.dump6.3 配置检查清单
是否设置了合适的堆大小
是否配置了GC日志
是否配置了OOM时的堆转储
是否考虑了容器环境
是否根据业务特点选择了合适的GC
是否设置了正确的字符集和时区
这个配置指南涵盖了从基础到高级的Java运行参数,可根据具体业务场景进行调整。建议在生产环境部署前进行充分的压力测试和性能调优。