在 Java 虚拟机(JVM)中,参数前缀 -XX:
表示的是 JVM 的非标准(实验性)选项。这些参数用于调整和优化 JVM 的性能、垃圾回收行为、内存分配策略等。
1. 参数分类
-XX:
参数大致分为三类,根据其格式区分:
-
布尔类型选项:用于启用或禁用某个特性。
- 格式:
-XX:+<Option>
或-XX:-<Option>
+
表示启用该选项。-
表示禁用该选项。
- 格式:
-
键值对选项:用于设置某个参数的具体值。
- 格式:
-XX:<Option>=<Value>
- 格式:
-
诊断选项:用于调试和诊断 JVM 的行为。
- 格式:类似于布尔类型和键值对,但通常需要额外启用
-XX:+UnlockDiagnosticVMOptions
。
- 格式:类似于布尔类型和键值对,但通常需要额外启用
2. 常用的 -XX:
参数
2.1 布尔类型参数
参数 | 说明 | 默认值 |
---|---|---|
-XX:+UseG1GC | 启用 G1 垃圾回收器。 | 否 |
-XX:+UseParallelGC | 启用并行垃圾回收器(Parallel GC)。 | 是 |
-XX:+UseConcMarkSweepGC | 启用 CMS 垃圾回收器(Concurrent Mark-Sweep)。 | 否 |
-XX:-UseAdaptiveSizePolicy | 禁用自适应内存分配策略(与垃圾回收器有关)。 | 否 |
-XX:+PrintGCDetails | 输出详细的 GC 日志信息。 | 否 |
-XX:+PrintGCDateStamps | 输出 GC 日志时添加时间戳。 | 否 |
-XX:+HeapDumpOnOutOfMemoryError | 当发生 OutOfMemoryError 时生成堆转储文件。 | 否 |
2.2 键值对类型参数
参数 | 说明 | 默认值 |
---|---|---|
-XX:MaxHeapSize=<size> | 设置堆的最大大小。例如 -XX:MaxHeapSize=512m 或 -XX:MaxHeapSize=2g 。 | 系统自动计算 |
-XX:InitialHeapSize=<size> | 设置堆的初始大小。 | 系统自动计算 |
-XX:MaxMetaspaceSize=<size> | 设置元空间的最大大小(仅适用于 Java 8 及以上)。 | 无限(受系统限制) |
-XX:ThreadStackSize=<size> | 设置每个线程的堆栈大小。 | 与操作系统相关 |
-XX:NewRatio=<value> | 设置新生代和老年代内存比例。例如,-XX:NewRatio=2 表示新生代是老年代的 1/2。 | 2 |
-XX:SurvivorRatio=<value> | 设置 Eden 区和 Survivor 区的比例。例如,-XX:SurvivorRatio=8 表示 Eden 是 Survivor 的 8 倍。 | 8 |
-XX:MaxTenuringThreshold=<value> | 设置对象从新生代晋升到老年代所需的最大年龄。 | 15 |
2.3 诊断和调试参数
诊断参数需要配合 -XX:+UnlockDiagnosticVMOptions
使用。例如:
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version
参数 | 说明 | 备注 |
---|---|---|
-XX:+UnlockExperimentalVMOptions | 启用实验性参数。 | 使用时需谨慎 |
-XX:+PrintFlagsFinal | 打印 JVM 参数的最终值,包括默认值和用户设置值。 | 调试常用 |
-XX:+TraceClassLoading | 打印类加载的详细信息。 | 调试类加载问题 |
-XX:+TraceClassUnloading | 打印类卸载的详细信息。 | 调试类卸载问题 |
-XX:+LogCompilation | 输出 JIT 编译相关日志,通常与 -XX:+UnlockDiagnosticVMOptions 一起使用。 | 性能调优 |
-XX:+PrintGCApplicationStoppedTime | 打印 GC 导致的应用停止的时间。 | GC 调优 |
3. 常见场景下的 -XX:
参数使用
3.1 设置 JVM 堆大小
设置 JVM 的堆初始大小和最大大小:
java -XX:InitialHeapSize=512m -XX:MaxHeapSize=2g -jar app.jar
- 初始堆大小:512 MB。
- 最大堆大小:2 GB。
3.2 启用 G1 垃圾回收器
使用 G1 垃圾回收器并设置最大暂停时间目标:
java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar app.jar
-XX:+UseG1GC
:启用 G1 垃圾回收器。-XX:MaxGCPauseMillis=200
:目标最大暂停时间为 200 毫秒。
3.3 打印 GC 日志
调试 GC 时输出详细日志:
java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log -jar app.jar
-XX:+PrintGCDetails
:打印详细的 GC 信息。-XX:+PrintGCDateStamps
:添加时间戳。-Xloggc:gc.log
:将 GC 日志输出到文件gc.log
。
3.4 调试类加载
输出类加载和卸载信息:
java -XX:+TraceClassLoading -XX:+TraceClassUnloading -jar app.jar
-XX:+TraceClassLoading
:打印类加载的详细信息。-XX:+TraceClassUnloading
:打印类卸载的详细信息。
3.5 在 OOM 时生成堆转储
捕获内存溢出时生成堆转储文件:
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heapdump.hprof -jar app.jar
-XX:+HeapDumpOnOutOfMemoryError
:发生OutOfMemoryError
时生成堆转储。-XX:HeapDumpPath=./heapdump.hprof
:设置堆转储文件的保存路径。
4. 如何查看支持的 -XX:
参数
运行以下命令查看所有 JVM 参数及其默认值:
java -XX:+PrintFlagsFinal -version
输出结果示例:
size Flags Name
512 -XX:InitialHeapSize
2048 -XX:MaxHeapSize
0 -XX:+UseG1GC
列出所有支持的 JVM 参数:
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsInitial -version
5. 注意事项
- 稳定性:某些
-XX:
参数是实验性或诊断参数,可能在不同版本的 JVM 中行为不同,需谨慎使用。 - 兼容性:参数在不同的 JVM 实现(如 Oracle JDK 和 OpenJDK)中可能略有差异。
- 调优慎重:在生产环境中调整
-XX:
参数时,应先在测试环境中充分验证。
总结
-XX:
参数为 JVM 调优提供了强大的工具,适合垃圾回收优化、性能调试、类加载分析等场景。理解这些参数的作用和用法可以帮助开发者更好地优化 Java 应用的性能和稳定性。