常用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停顿时间,提高应用稳定性。实际配置时应结合应用特点和监控数据进行调优

相关推荐
jbtianci24 分钟前
Spring Boot管理用户数据
java·spring boot·后端
那我掉的头发算什么39 分钟前
【Mybatis】Mybatis-plus使用介绍
服务器·数据库·后端·spring·mybatis
会算数的⑨1 小时前
Kafka知识点问题驱动式的回顾与复习——(一)
分布式·后端·中间件·kafka
Hx_Ma161 小时前
SSM搭建(三)Spring整合SpringMVC框架
java·后端·spring
William_cl1 小时前
ASP.NET路由长度约束精讲:[HttpGet (“{name:minlength (3)}“)] 字符长度限制吃透,附避坑指南 + 实战代码
后端·asp.net
我命由我123451 小时前
Java 泛型 - Java 泛型通配符(上界通配符、下界通配符、无界通配符、PECS 原则)
java·开发语言·后端·java-ee·intellij-idea·idea·intellij idea
szhf781 小时前
SpringBoot Test详解
spring boot·后端·log4j
无尽的沉默1 小时前
SpringBoot整合Redis
spring boot·redis·后端
摸鱼的春哥1 小时前
春哥的Agent通关秘籍07:5分钟实现文件归类助手【实战】
前端·javascript·后端