1、启动参数分类
标准 | 解释 | 方法 |
---|---|---|
标准参数(-) | 所有的JVM实现都必须实现这些参数的功能,而且向后兼容 | cmd中输入”java -help”或者”java -?”可查看 |
非标准参数(-X) | 默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容 | ”java -X”可以输出非标准参数列表 |
非稳定参数(-XX) | 此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使 | java -XX:+PrintFlagsInitial -XX:+PrintFlagsInitial |
2、参数配置详解
2.1 堆大小配置
参数 | 解释 |
---|---|
-Xmx4g | 设置JVM最大可用内存为4g(默认为物理内存的1/4) |
-Xms4g | 设置JVM初始内存为4g。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存(默认为物理内存的1/64) |
-Xmn2g | 设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小 。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8,在JDK1.4版本以后才使用的 |
-Xss128k | 设置每个线程的栈大小,JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K |
-XX:NewRatio=4 | 设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5,(默认为2) |
-XX:SurvivorRatio=4 | 默认为8,设置年轻代中Eden区与Survivor区(即:From幸存区和To幸存区)的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6 |
-XX:MaxPermSize=16m | 设置持久代大小为16m,(jdk7及之前存在) |
-XX:MaxTenuringThreshold=0 | 设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代 。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间 ,增加在年轻代即被回收的概论 |
-XX:MaxMetaspaceSize=512m | 设置元数据空间最大值,(jdk8及之后) |
-XX:MetaspaceSize=1m | 指Metaspace扩容时触发FullGC的初始化阈值 |
-XX:+UseAdaptiveSizePolicy | JDK 1.8 默认使用 UseParallelGC 垃圾回收器,该垃圾回收器默认启动了 AdaptiveSizePolicy,会根据GC的情况自动计算计算 Eden、From 和 To 区的大小 |
-XX:-UseAdaptiveSizePolicy | 同上,关闭(面向外部的大流量、低延迟系统,不建议启用此参数,建议关闭该参数) |
-XX:+UseGCOverheadLimit | 关闭GC Overhead limit exceeded异常,但治标不治本 |
2.2 收集器选择
JVM提供了三种收集器:串行收集器、并行收集器、并发收集器;串行收集器只适用于小数据量的情况,不做讲解。
2.2.1吞吐量优先的并行收集器
参数 | 解释 |
---|---|
-XX:+UseParallelGC | 选择垃圾收集器为并行收集器 |
-XX:+UseParallelOldGC | 配置年老代垃圾收集方式为并行收集 |
-XX:MaxGCPauseMillis=100 | 设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。 |
-XX:+UseAdaptiveSizePolicy | 设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开 |
2.2.1响应时间优先的并发收集器
参数 | 解释 |
---|---|
-XX:+UseConcMarkSweepGC | 设置年老代为并发收集 |
-XX:+UseParNewGC | 设置年轻代为并行收集 |
-XX:CMSFullGCsBeforeCompaction=5 | 由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理 |
-XX:+UseCMSCompactAtFullCollection | 打开对年老代的压缩。可能会影响性能,但是可以消除碎片 |
2.3辅助配置
参数 | 解释 |
---|---|
-XX:+PrintGC | 输出形式:[GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs] |
-XX:+PrintGCDetails | 输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] |
-XX:+PrintGCTimeStamps | 可与上面两个混合使用,输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs] |
-XX:+PrintGCApplicationConcurrentTime | 打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用;输出形式:Application time: 0.5291524 seconds |
XX:+PrintGCApplicationStoppedTime | 打印垃圾回收期间程序暂停的时间。可与上面混合使用;输出形式:Total time for which application threads were stopped: 0.0468229 seconds |
-XX:PrintHeapAtGC | 打印GC前后的详细堆栈信息 |
-Xloggc:filename | 与上面几个配合使用,把相关日志信息记录到文件以便分析。 |
3、示例
java -jar
-Xms2048m
-Xmx2048m
-Xss500k
-XX:NewRatio=1
-XX:SurvivorRatio=6
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=128m
-XX:-UseAdaptiveSizePolicy
-XX:+UseParallelGC
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintHeapAtGC
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp/
-Xloggc:/log/tmp/gc_%p_%t_.log
-Dfile.encoding=UTF-8
-Djava.rmi.server.hostname=localhost
-Dcom.sun.management.jmxremote.port=11111
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.managementote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false test.jar > test.log
三部分,1、基本配置;2、辅助配置;3、辅助监控(jvisualvm)