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

相关推荐
猪是念来过倒2 小时前
Semaphore 与 RateLimiter:并发控制双雄详解
后端
掘金者阿豪2 小时前
异构数据同步最怕什么?不是同步慢,而是数据对不上
后端
程序员cxuan3 小时前
Claude 官方的学习教程,太强了。
人工智能·后端·程序员
老孙讲技术3 小时前
把工地遮挡和掉线接进项目部:setMessageCallback 订 alarm 与 deviceStatus
后端·物联网·音视频开发
老孙讲技术3 小时前
关店后有人进门,监控值班群却没响:用 setMessageCallback 订 human,再用 aiHuman 打开人形
后端·物联网·音视频开发
LEE3 小时前
原来 Claude Code 最厉害的工具,一行代码都不写
前端·后端
老孙讲技术3 小时前
把园区几百路摄像头收进值班台账:bindDevice 入账与 listDeviceDetailsByPage 翻页
后端·物联网·音视频开发
用户7813667114453 小时前
emplace_back vs push_back 详解
后端
老孙讲技术3 小时前
把没网没电的户外点位接进出画值班台:unBindDeviceInfo 核 SIMCard 与 bindDeviceLive
后端·物联网·音视频开发
万物智能3 小时前
硬件调试三板斧—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
后端·架构