Java JVM(Java虚拟机)启动参数的设置对于优化Java应用程序的性能至关重要。这些参数可以分为标准参数、非标准参数(也称为-X参数)和非Stable参数(以-XX为前缀)。以下是一些常用的JVM启动参数设置:
一、标准参数
- -verbose:gc
- 输出虚拟机中垃圾收集(GC)的详细情况。
- -verbose:class
- 输出JVM载入类的相关信息,当JVM报告找不到类或类冲突时,可用于诊断。
二、非标准参数(-X)
- -Xms<size>
- 设置JVM启动时的初始堆内存大小。例如,
-Xms512m
表示设置JVM堆内存初始值为512MB。
- 设置JVM启动时的初始堆内存大小。例如,
- -Xmx<size>
- 设置JVM可使用的最大堆内存大小。例如,
-Xmx1024m
表示设置JVM堆内存最大可用内存为1024MB。为了避免JVM内存自动扩展,建议将-Xmx和-Xms设置为相同的值。
- 设置JVM可使用的最大堆内存大小。例如,
- -Xmn<size>
- 设置年轻代(Young Generation)的大小。例如,
-Xmn200m
表示设置年轻代大小为200MB。年轻代用于存放新生成的对象,其大小对系统性能有较大影响。
- 设置年轻代(Young Generation)的大小。例如,
- -Xss<size>
- 设置每个线程的堆栈大小。例如,
-Xss128k
表示设置每个线程的堆栈大小为128KB。根据应用的线程所需内存大小进行调整。
- 设置每个线程的堆栈大小。例如,
三、非Stable参数(-XX)
- -XX:+UseSerialGC
- 启用串行垃圾收集器。这是JVM的默认GC方式,一般适用于小型应用和单处理器。
- -XX:+UseParallelGC
- 启用并行垃圾收集器。并行GC在GC运行时,对应用程序运行没有影响,可以最大限度不影响app的运行。
- -XX:+UseConcMarkSweepGC
- 启用并发标记交换算法进行GC。适用于多处理器系统,可以提高GC的效率,但算法复杂,系统消耗较大。
- -XX:NewRatio=<int>
- 设置年轻代(Young Generation)与老年代(Old Generation)的比例。例如,
-XX:NewRatio=3
表示年轻代与老年代的比例为1:3。
- 设置年轻代(Young Generation)与老年代(Old Generation)的比例。例如,
- -XX:SurvivorRatio=<int>
- 设置Eden区与Survivor区的大小比例。例如,
-XX:SurvivorRatio=8
表示Eden区与Survivor区的比例为8:1。
- 设置Eden区与Survivor区的大小比例。例如,
- -XX:MaxPermSize=<size>
- 设置永久代(PermGen space,在Java 8中已被元空间Metaspace替代)的最大值。例如,
-XX:MaxPermSize=256m
。但请注意,在Java 8及更高版本中,应使用-XX:MaxMetaspaceSize
来设置元空间的最大值。
- 设置永久代(PermGen space,在Java 8中已被元空间Metaspace替代)的最大值。例如,
- -XX:+HeapDumpOnOutOfMemoryError
- 当堆内存空间溢出时,输出堆的内存快照。
- -XX:HeapDumpPath=<path>
- 指定堆内存快照的输出路径。
- -XX:+PrintGC
- 每次GC时打印相关信息。
- -XX:+PrintGCDetails
- 每次GC时打印详细信息,包括各个区的情况。
- -Xloggc:<file-path>
- 指定GC日志的输出路径。例如,
-Xloggc:/data/logs/gc.log
。
- 指定GC日志的输出路径。例如,
- -XX:NumberOfGCLogFiles=<int>
- 设置GC日志文件的滚动个数。
- -XX:GCLogFileSize=<size>
- 设置每个GC日志文件的大小。
四、其他常用参数
- -D<name>=<value>
- 设置系统属性。例如,
-Dspring.profiles.active=prd
用于设置Spring框架的活动配置文件。
- 设置系统属性。例如,
- -server
- 设置JVM使用server模式。该模式下,JVM的启动速度较慢,但运行时性能和内存管理效率更高,适用于生产环境。
- -Xbootclasspath:<path>
- 指定JVM加载但不想通过校验的类路径。
- -Xdebug
- JVM调试参数,用于调试。例如,在Tomcat中设置远程调试时,可以使用
-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
。
- JVM调试参数,用于调试。例如,在Tomcat中设置远程调试时,可以使用
请注意,不同的JVM实现(如Oracle JDK、OpenJDK等)可能对某些参数的支持有所不同,且随着JVM版本的更新,某些参数可能会被弃用或引入新的参数。因此,在设置JVM参数时,建议查阅当前JVM版本的官方文档以获取最准确的信息。