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

相关推荐
柏油3 小时前
MySQL InnoDB 行锁
数据库·后端·mysql
咖啡调调。3 小时前
使用Django框架表单
后端·python·django
白泽talk3 小时前
2个小时1w字| React & Golang 全栈微服务实战
前端·后端·微服务
摆烂工程师3 小时前
全网最详细的5分钟快速申请一个国际 “edu教育邮箱” 的保姆级教程!
前端·后端·程序员
一只叫煤球的猫3 小时前
你真的会用 return 吗?—— 11个值得借鉴的 return 写法
java·后端·代码规范
Asthenia04124 小时前
HTTP调用超时与重试问题分析
后端
颇有几分姿色4 小时前
Spring Boot 读取配置文件的几种方式
java·spring boot·后端
AntBlack4 小时前
别说了别说了 ,Trae 已经在不停优化迭代了
前端·人工智能·后端
@淡 定4 小时前
Spring Boot 的配置加载顺序
java·spring boot·后端