一、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后打印类的统计信息,包括实例数量和占用内存:
makefilenum #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
五、总结
- GC日志参数是性能调优的基础,生产环境建议至少配置
-XX:+PrintGCDetails -Xloggc:gc.log
。 - 堆大小设置应结合实际物理内存,通常
-Xms
和-Xmx
设为相同值。 - 新生代大小对GC频率有重大影响,官方推荐占堆的3/8。
- OOM时自动生成堆转储(
-XX:+HeapDumpOnOutOfMemoryError
)是排查内存问题的利器。 - 对于栈深度要求高的应用,可适当增加
-Xss
值。 - Java 8+用户应注意元空间配置替代了永久代参数。
合理配置这些参数可以显著提升JVM性能,减少GC停顿时间,提高应用稳定性。实际配置时应结合应用特点和监控数据进行调优