JVM 启动参数是启动 Java 应用程序时,用来控制 JVM 行为的重要工具。通过合理的配置,可以调优 Java 应用的性能、内存管理和垃圾回收等方面。以下是一些常用的 JVM 启动参数,分为内存相关、垃圾回收相关、性能调优、调试和其他常见配置参数:
1. 内存管理相关参数
这些参数用于设置 JVM 的内存大小和内存分配策略。
1.1 堆内存参数
-Xms<size>
:设置 JVM 堆的初始大小(例如-Xms512m
)。JVM 启动时会分配给堆的内存大小。-Xmx<size>
:设置 JVM 堆的最大大小(例如-Xmx2g
)。JVM 的堆内存最大限制,超过此值会导致OutOfMemoryError
。
1.2 年轻代、老年代内存参数
-Xmn<size>
:设置年轻代的大小,通常设置为堆内存的 1/3,影响新生代的内存分配。-XX:NewSize=<size>
:设置新生代初始内存大小。-XX:MaxNewSize=<size>
:设置新生代最大内存大小。-XX:SurvivorRatio=<ratio>
:设置 Eden 区与 Survivor 区的大小比,默认是 8:1。
1.3 Metaspace(类元数据区域)相关参数
-XX:MetaspaceSize=<size>
:设置 Metaspace 区域的初始大小,默认为 21MB。-XX:MaxMetaspaceSize=<size>
:设置 Metaspace 的最大大小。如果不设置,Metaspace 会扩展到操作系统支持的最大值。
1.4 JVM 堆大小限制
-XX:MaxDirectMemorySize=<size>
:设置直接内存(Direct Memory)的最大值,常用于 NIO 操作的内存分配。
2. 垃圾回收相关参数
这些参数用来调整垃圾回收的行为和策略,影响 Java 应用的性能。
2.1 选择垃圾回收器
-XX:+UseSerialGC
:使用串行垃圾回收器,适合单核机器。-XX:+UseParallelGC
:使用并行垃圾回收器,适合多核机器。-XX:+UseConcMarkSweepGC
:使用 CMS 垃圾回收器(并发标记-清理),适合对响应时间敏感的应用。-XX:+UseG1GC
:使用 G1 垃圾回收器,适合大内存系统并且关注低延迟和高吞吐量的场景。
2.2 垃圾回收调优
-XX:ParallelGCThreads=<num>
:设置并行垃圾回收的线程数,默认是可用 CPU 核数。-XX:ConcGCThreads=<num>
:设置并发垃圾回收的线程数,常用于 CMS 和 G1。-XX:MaxGCPauseMillis=<time>
:设置 G1 垃圾回收器的最大暂停时间(单位:毫秒),G1 会尽量保持垃圾回收暂停时间小于这个值。
2.3 年轻代垃圾回收参数
-XX:MinHeapFreeRatio=<percentage>
:设置堆内存中最小空闲空间比例,当堆内存空闲空间比例小于此值时,JVM 会触发垃圾回收。-XX:MaxHeapFreeRatio=<percentage>
:设置堆内存中最大空闲空间比例,当堆内存空闲空间比例超过此值时,JVM 会触发垃圾回收。
2.4 GC 日志
-Xloggc:<file>
:指定垃圾回收日志文件的输出路径。-XX:+PrintGCDetails
:打印垃圾回收的详细信息。-XX:+PrintGCDateStamps
:打印垃圾回收的时间戳。-XX:+PrintGCApplicationStoppedTime
:打印应用暂停的时间。
3. 性能调优参数
这些参数用于调优 JVM 的性能,尤其是在高并发、大数据量处理的应用场景中。
3.1 JIT 编译器相关
-XX:+UseJITCompilation
:启用即时编译(JIT)功能。-XX:CompileThreshold=<count>
:设置 JIT 编译的阈值,即方法调用次数大于此值时会进行 JIT 编译。
3.2 堆外内存(Direct Memory)
-XX:MaxDirectMemorySize=<size>
:设置直接内存的最大大小,适用于 NIO 相关操作。
3.3 线程数和调度
-XX:ThreadStackSize=<size>
:设置线程栈的大小(单位:字节)。-XX:CICompilerCount=<count>
:设置 JIT 编译器的线程数。
4. 调试和诊断相关参数
这些参数用于帮助调试和分析 JVM 的运行状态。
4.1 堆转储和诊断
-XX:+HeapDumpOnOutOfMemoryError
:当内存溢出时,自动生成堆转储文件(heap dump)。-XX:HeapDumpPath=<path>
:指定堆转储文件保存的路径。-XX:+PrintGC
:打印 GC 信息,帮助分析垃圾回收性能。
4.2 远程调试
-Xdebug
:开启远程调试功能。-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
:指定调试的端口,8000
是默认端口。
5. 其他常用参数
这些参数用于控制 JVM 的一些其他行为,如类加载、资源限制等。
5.1 类加载相关
-XX:+DisableExplicitGC
:禁用显式调用System.gc()
。-XX:MaxPermSize=<size>
:设置永久代(Metaspace 前的区域)的最大大小。PermGen
在 Java 8 中被 Metaspace 替代。
5.2 资源限制
-XX:MaxFileDescriptorCount=<count>
:设置最大文件描述符数量,适用于需要大量文件描述符的应用。
5.3 本地内存限制
-Xss<size>
:设置每个线程的栈大小。
常见的 JVM 启动参数示例:
假设你有一个应用,想要为它配置较大的堆内存、启用 G1 垃圾回收、启用 GC 日志并设置远程调试,可以使用如下启动命令:
java -Xms2g -Xmx4g -XX:+UseG1GC -Xloggc:/path/to/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 -jar myapp.jar
总结
JVM 启动参数是调优和配置 JVM 行为的重要工具。通过调整堆内存大小、垃圾回收器的选择、JIT 编译策略等,可以显著提升应用的性能。在生产环境中,合理设置这些参数,特别是在内存管理、垃圾回收和线程管理方面,是确保 Java 应用高效运行的关键。