JVM常用参数配置解析(jvm常用参数及作用)
文章标签:
java虚拟机参数
JVM(Java虚拟机)的参数配置对于优化Java应用程序的性能至关重要。本文将介绍一些常见的JVM参数配置。
一、标准参数
- -client和-server:设置JVM使用client模式或server模式。client模式启动快,但性能和内存管理效率不高,适用于桌面应用;server模式启动慢,但性能和内存管理效率高,适用于服务器。64位的JVM只有server模式。
- -verbose:查询GC(垃圾回收)问题最常用的命令之一,常用于排查GC问题。例如,-verbose:gc输出每次GC的相关情况,-verbose:class输出JVM载入类的相关信息,-verbose:jni输出native方法调用的相关情况。
二、非标准参数(-X)
- -Xms:设置初始堆内存大小,即程序启动时占用内存大小,默认是物理内存的1/64。
- -Xmx:设置最大堆内存大小,即程序运行期间最大可占用的内存大小。如果程序运行需要占用更多的内存,超出了这个设置值,就会抛出OutOfMemory异常,默认是物理内存的1/4。
- -Xmn:设置年轻代大小,增大年轻代会减少老年代大小,官网推荐整堆的3/8。
- -Xss:设置单个线程栈内存大小,默认是1MB。
三、非标准参数(-XX)
性能参数
- -XX:+UseSerialGC:使用串行垃圾收集器。
- -XX:+UseParallelGC:使用并行垃圾收集器(年轻代)。
- -XX:+UseParallelOldGC:使用并行垃圾收集器(老年代),JDK6.0以上支持。
- -XX:+UseConcMarkSweepGC:使用CMS(Concurrent Mark Sweep)垃圾收集器,适用于多CPU,并要求缩短因GC造成程序停滞的时间。
- -XX:+UseG1GC:使用G1垃圾收集器。
- -XX:+HeapDumpOnOutOfMemoryError:这个参数告诉JVM在内存溢出错误发生时生成堆转储文件。
- -XX:HeapDumpPath={HEAP-DUMP-FILE-PATH} :这个参数指定了堆转储文件的存储路径。需要将{HEAP-DUMP-FILE-PATH}替换为实际的文件路径。
行为参数
- -XX:NewRatio:设置年轻代(包括Eden和两个Survivor区)与老年代的比值(除去持久代)。例如,设置为4,则年轻代与老年代所占比值为1:4。
- -XX:SurvivorRatio:设置年轻代中Eden区与Survivor区的大小比值。例如,设置为4,则两个Survivor区与一个Eden区的比值为2:4。
- -XX:MaxTenuringThreshold:设置垃圾最大年龄。如果设置为0,则年轻代对象不经过Survivor区,直接进入老年代。
- -XX:PermSize 和 -XX:MaxPermSize:设置持久代(PermGen space)的初始大小和最大大小。不过,在Java 8中,PermGen space被元空间(Metaspace)所替代,相关参数变为-XX:MetaspaceSize和-XX:MaxMetaspaceSize。
调试参数
- -XX:+PrintGC:每次触发GC时打印相关日志。
- -XX:+PrintGCDetails:打印更详细的GC日志。
- -XX:+PrintGCTimeStamps:打印GC发生的时间戳。
- -Xloggc:filename:将GC日志输出到指定文件。例如,-Xloggc:/data/gclog/gc.log表示将GC日志输出到指定路径。
- -XX:+DisableExplicitGC:禁用System.gc()调用,防止显式触发Full GC。
四、实际应用中的配置示例
辅助指令jinfo
jinfo:查看或修改正在运行的JVM配置。例如,jinfo -flag
HeapDumpOnOutOfMemoryError 870778用于查看进程号为870778的JVM是否开启了
HeapDumpOnOutOfMemoryError配置。
配置示例
堆内存配置
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
这里设置了JVM最大可用内存为3550MB,初始内存也为3550MB(避免垃圾回收后重新分配内存),年轻代大小为2GB,每个线程的堆栈大小为128KB。
并行收集器配置
java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20
这里选择了并行垃圾收集器,并配置了20个并行GC线程。
五、注意事项
- 在进行JVM调优之前,建议先进行性能分析和监控,找出潜在的瓶颈和问题点。
- 不同的应用程序可能需要不同的参数配置,因此需要根据具体应用程序的特性和工作负载进行评估和测试。
- 避免过度创建对象,以减少垃圾回收的负担。