常用JVM配置参数

一、Trace跟踪参数

Trace跟踪参数用于监控和记录JVM的运行情况,特别是垃圾回收(GC)的相关信息,对于性能调优和问题排查非常重要。

1. GC日志相关参数

  • -verbose:gc / -XX:+PrintGC

    打印GC的简要信息,格式如:
    [GC 4790K->374K(15872K), 0.0001606 secs]

  • -XX:+PrintGCDetails

    打印GC的详细信息,包括各内存区域的使用情况:

    scss 复制代码
    [GC[DefNew: 4416K->0K(4928K), 0.0001897 secs] 4790K->374K(15872K), 0.0002232 secs]
  • -XX:+PrintGCTimeStamps

    在GC日志中添加时间戳,便于分析GC发生的时间点。

  • -Xloggc:log/gc.log

    将GC日志输出到指定文件,便于长期保存和分析。

  • -XX:+PrintHeapAtGC

    每次GC后打印堆的详细信息,包括各代内存的使用情况。

2. 类加载监控参数

  • -XX:+TraceClassLoading

    监控类的加载过程,输出类似:

    vbnet 复制代码
    [Loaded java.lang.Object from shared objects file]
    [Loaded java.io.Serializable from shared objects file]
  • -XX:+PrintClassHistogram

    按下Ctrl+Break后打印类的统计信息,包括实例数量和占用内存:

    makefile 复制代码
    num     #instances         #bytes  class name
    ----------------------------------------------
    1:        890617      470266000  [B
    2:        890643       21375432  java.util.HashMap$Node

二、堆内存分配参数

堆内存是JVM中最重要的内存区域,合理的配置对性能至关重要。

1. 基础堆参数

  • -Xms
    设置JVM初始堆大小,如-Xms5m表示初始堆为5MB。
  • -Xmx
    设置JVM最大堆大小,如-Xmx20m表示最大堆为20MB。

最佳实践:生产环境中通常将-Xms和-Xmx设为相同值,避免堆动态调整带来的性能开销。

2. 新生代配置参数

  • -Xmn
    设置新生代大小,如-Xmn15m
  • -XX:NewRatio
    设置新生代与老年代的比例。例如-XX:NewRatio=4表示新生代:老年代=1:4。
  • -XX:SurvivorRatio
    设置Eden区与Survivor区的比例。例如-XX:SurvivorRatio=8表示两个Survivor区:Eden=2:8。

官方推荐

  • 新生代占堆大小的3/8
  • 每个Survivor区占新生代的1/10

3. OOM相关参数

  • -XX:+HeapDumpOnOutOfMemoryError

    在发生OOM时自动生成堆转储文件。

  • -XX:HeapDumpPath

    指定堆转储文件的保存路径,如-XX:HeapDumpPath=d:/a.dump

  • -XX:OnOutOfMemoryError

    在OOM时执行指定脚本,可用于发送警报或自动重启:

    ini 复制代码
    -XX:OnOutOfMemoryError="D:/tools/jdk1.7_40/bin/printstack.bat %p"

三、永久代/元空间参数

在Java 8之前,永久代(PermGen)用于存储类元数据等信息。

  • -XX:PermSize
    设置永久代初始大小。
  • -XX:MaxPermSize
    设置永久代最大大小。

注意:使用CGLIB等动态生成类的库时,可能因产生大量类导致永久代OOM。Java 8及以后版本已移除永久代,改用元空间(Metaspace)。

四、栈大小参数

  • -Xss
    设置每个线程的栈大小,通常为几百KB,如-Xss256K

栈大小决定了方法调用的深度,局部变量和参数都分配在栈上。较小的栈大小可能导致StackOverflowError

示例测试:

csharp 复制代码
public class TestStackDeep {
    private static int count=0;
    public static void recursion(){
        count++;
        recursion();
    }
    public static void main(String args[]){
        try{
            recursion();
        }catch(Throwable e){
            System.out.println("deep of calling = "+count);
        }
    }
}

测试结果:

  • -Xss128K:调用深度约701
  • -Xss256K:调用深度约1817

五、总结

  1. GC日志参数是性能调优的基础,生产环境建议至少配置-XX:+PrintGCDetails -Xloggc:gc.log
  2. 堆大小设置应结合实际物理内存,通常-Xms-Xmx设为相同值。
  3. 新生代大小对GC频率有重大影响,官方推荐占堆的3/8。
  4. OOM时自动生成堆转储(-XX:+HeapDumpOnOutOfMemoryError)是排查内存问题的利器。
  5. 对于栈深度要求高的应用,可适当增加-Xss值。
  6. Java 8+用户应注意元空间配置替代了永久代参数。

合理配置这些参数可以显著提升JVM性能,减少GC停顿时间,提高应用稳定性。实际配置时应结合应用特点和监控数据进行调优

相关推荐
短剑重铸之日1 小时前
《SpringCloud实用版》 Seata 分布式事务实战:AT / TCC / Saga /XA
后端·spring·spring cloud·seata·分布式事务
FAFU_kyp1 小时前
RISC0_ZERO项目在macOs上生成链上证明避坑
开发语言·后端·学习·macos·rust
qq_12498707531 小时前
基于springboot的会议室预订系统设计与实现(源码+论文+部署+安装)
java·vue.js·spring boot·后端·信息可视化·毕业设计·计算机毕业设计
女王大人万岁2 小时前
Go语言time库核心用法与实战避坑
服务器·开发语言·后端·golang
J_liaty2 小时前
Spring Boot + MinIO 文件上传工具类
java·spring boot·后端·minio
短剑重铸之日2 小时前
《SpringCloud实用版》Stream + RocketMQ 实现可靠消息 & 事务消息
后端·rocketmq·springcloud·消息中间件·事务消息
没有bug.的程序员2 小时前
Spring Boot 事务管理:@Transactional 失效场景、底层内幕与分布式补偿实战终极指南
java·spring boot·分布式·后端·transactional·失效场景·底层内幕
LuminescenceJ3 小时前
GoEdge 开源CDN 架构设计与工作原理分析
分布式·后端·网络协议·网络安全·rpc·开源·信息与通信
Tony Bai3 小时前
【分布式系统】11 理论的试金石:用 Go 从零实现一个迷你 Raft 共识
开发语言·后端·golang
短剑重铸之日3 小时前
《SpringCloud实用版》统一认证授权:Spring Authorization Server + OAuth2 + JWT 生产级方案
java·后端·spring·jwt·oauth2