JVM参数的含义
参数名称 | 含义 | 默认值 | 备注 |
---|---|---|---|
-Xms | 初始堆大小 | 物理内存的1/64(小于1GB) | 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM会增大堆直到-Xmx的最大限制 |
-Xmx | 最大堆大小 | 物理内存的1/4(小于1GB) | 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制 |
-Xmn | 年轻代大小 | 注意:此处的大小是指eden区+survivor0区+survivor1区。与jmap -heap中显示的New gen是不同的。 整个堆大小=年轻代大小+老年代大小+永久代大小。 增大年轻代后,将会减小老年代大小,此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8 | |
-XX:NewSize | 设置年轻代大小(初始值及最大值) | ||
-XX:MaxNewSize | 年轻代最大值 | ||
-XX:PermSize | 设置永久代(Perm gen)初始值 | 物理内存的1/64 | |
-XX:MaxPermSize | 设置持久代最大值 | 物理内存的1/4 | |
-Xss | 每个线程的堆栈大小 | 一般默认为215K~1024K | JDK5.0之后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多线程,但操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右 一般小的应用,如果栈不是很深,应该128K是够用的,大的应用建议使用256k,这个选项对性能影响比较大,需要严格测试 |
-XX:ThreadStackSize | 等价于-Xss | -XX:ThreadStackSize = 0,表示使用默认512K~1024K;-XX:ThreadStackSize != 0,表示自定义的 | |
-XX:NewRatio | 年轻代(包括eden和两个survivor区)与老年代的比值(除去持久代) | -XX:NewRatio=4表示年轻代与老年代所占比重为1:4,年轻代占整个堆栈的1/5 Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置 | |
-XX:SurvivorRartio | Eden区与Survivor区大小的比值 | 设置为8,则两个Survivor区和一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10 | |
-XX:LargePageSizeInBytes | 单个内存页的大小,不能设置过大,会影响Perm的大小 | ||
-XX:+UseFastAccessorMethods | 原始类型get、set方法的快速优化,对于JVM来说是冗余代码,jvm将进行优化 | ||
-XX:+DisableExplictGC | 关闭System.gc() | 这个需要严格的测试 | |
-XX:MaxTenuringThreshold | 设置年轻代垃圾最大年龄 | 默认15 | 如果设置为0,则年轻代对象不经过Survivor区,直接进入老年代,对于老年代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象在年轻代的存活时间,增加年轻代被回收的概率 该参数只有在Serial GC时才有效 对象经过15次Young GC才会进入老年代 |
-XX:+AggressiveOpts | 加快编译 | ||
-XX:+UseBiasedLocking | 锁机制的性能改善 | ||
-Xnoclassgc | 禁用垃圾回收 | ||
-XX:SoftRefLRUPolicyMSPerMB | 每兆堆空间中软引用对象(SoftReference)的存活时间 | 1s | |
-XX:PertenureSizeThreshold | 对象超过多大直接在老年代分配 | 0 | 单位字节新生代采用Parallel Scavenge GC时无效 另一种直接在老年代分配的情况是大的数组对象,且数组中无外部引用对象 |
-XX:TLABWasteTargetPercent | TLAB占eden区的百分比 | 1% | |
-XX:+CollectGen0First | FullGCs=是否先Young GC | false |
并行收集相关参数
参数名称 | 含义 | 默认值 | 备注 |
---|---|---|---|
-XX:+UseParallelGC | 选择垃圾收集器为并行收集器。此配置仅对 年轻代有效。可以同时并行对个垃圾收集线程,但此时用户线程必须停止 | ||
-XX:+UseParNewGC | 设置年轻代为并行收集 | 可与CMS收集同时使用 JDK5.0以上,JVM会根据系统配置自行设置 | |
-XX:ParallelGCThreads | 并行收集器的线程数 | 此值最好配置与处理器署名相等,同样适用于CMS | |
-XX:+UseParallelOldGC | 设置老年代垃圾收集方式为并行收集 | JDK6出现的参数选项 | |
-XX:MaxGCPauseMillis | 每次年轻代垃圾回收 的最长时间(最大暂停时间) | 如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值 | |
-XX:+UseAdaptiveSizePolicy | 自动选择年轻代区大小和相应的Survivor区比例 | 设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开 | |
-XX:GCTimeRatio | 设置垃圾回收时间占程序运行时间的百分比 | 公式1/(1+n),假设-XX:GCTimeRatio=19,则垃圾收集时间为1/(1+19),默认值为99,即1%的时间用于垃圾收集 | |
-XX:+ScavengeBeforeFullGC | Full GC前调用Young GC | true |
CMS相关参数
参数名称 | 含义 | 默认值 | 备注 |
---|---|---|---|
-XX:+UseConcMarkSweepGC | 使用CMS垃圾回收器 | CMS为基于标记清除算法实现的多线程老年代垃圾回收器。CMS为响应时间优先的垃圾回收器,适合于应用服务器 | |
-XX:+AggressiveHeap | java堆最佳化设置 | 设置这个参数使长时间运行过的任务使用密集的内存分配。默认这个选项时关闭的,也就是堆不是最佳化 | |
-XX:CMSFullGCsBeforeCompaction | 在上一次CMS并发GC执行后,还要执行多少次Full GC才会做压缩 | 默认是0 | 在默认配置下每次CMS GC顶不住了而要转入Full GC的时候都会做压缩 由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率较低。此值设置运行多少次GC以后对内存空间进行压缩整理 |
-XX:+CMSParallelRemarkEnabled | 降低标记停顿 | ||
-XX:+UseCMSCompactAtFullCollection | 在Full GC的时候,对老年代压缩 | CMS是不会移动内存的,因此这个非常容易产生碎片,导致内存不够用,内存的压缩这个时候就会被启用。可能会影响性能,但是可以消除碎片 | |
-XX:+UseCMSInitinatingOccupancyOnly | 使用手动定义初始化定义开始CMS收集 | 禁止hostspot自行触发CMS GC | |
-XX:CMSInitatingOccupancyFraction | 使用cms作为垃圾回收,使用多少后开始CMS收集 | 92 | 为了保证不出现promotion failed错误,该值的设置需要满足以下公式:CMSInitiatingOccupancyFraction <=((Xmx-Xmn)-(Xmn-Xmn/(SurvivorRatior+2)))/(Xmx-Xmn)*100 promotion failed产生的原因可能有两种,第一个是年轻代没有足够的空间,年轻代的对象还不应该被移动到老年代,但年轻代又有很多对象需要放入存储空间;第二个是老年代没有足够空间接纳来自年轻代的对象 |
-XX:CMSInitiaingPermOccupancyFraction | 设置Perm Gen使用达到多少比率时触发 | 92 | |
-XX:+CMSIncrementailMode | 设置为增量模式 | 用于单CPU情况 | |
-XX:+CMSClassUnloadingEnable | 当使用CMS垃圾收集器时,允许类卸载,这个选项模式是开启的 | 禁止类卸载,可以使用-XX:-CMSClassUnloadingEnabled | |
-XX:CMSExpAvgFactor | 指定垃圾收集消耗的时间百分比 | 默认25% |
辅助信息
参数名称 | 含义 | 默认值 | 备注 |
---|---|---|---|
-XX:+PrintGC | 打印GC信息 | ||
-XX:+PrintGCDetails | 打印GC详细信息 | ||
-XX:+PrintGCTimeStamps | 打印GC时间戳 | ||
-XX:+PrintGC:PrintGCTimeStamps | -XX:+PrintGC与-XX:+PrintGCTimeStamps混合使用 | ||
-XX:+PrintGCApplicationStoppedTime | 打印垃圾回收期间程序暂停时间,可与上面几个参数混合使用 | 输出形式:Total time for which application threads were stopped: 0.0468229 seconds | |
-XX:+PrintGCApplicationConcurrentTime | 打印每次垃圾回收前,程序未中断的执行时间,可与上面混合使用 | 输出形式:Application time: 0.5291524 seconds | |
-XX:PrintHeapAtGC | 打印GC前后的详细堆栈信息 | ||
-Xloggc:filename | 将GC信息输出到文件,带时间戳,可与上面配合使用 | 如:-Xloggc:E:\gc.txt,JDK11已过期,新版本使用-Xlog:gc:gc.txt代替 | |
-XX:PrintClassHistogram | 在垃圾回收之前打印出实例的数量以及空间大小 | ||
-XX:+UseTLAB | 使用TLAB | TLAB的全称是Thread Local Allocation Buffer,即线程本地分配缓存区。JVM使用TLAB来避免多线程冲突,在给对象分配内存时,每个线程使用自己的TLAB,这样可以避免线程同步,提高对象的分配效率 | |
-XX:+TLABSize | 设置TLAB大小 | ||
-XX:+TLABRefillWasteFraction | 设置维护进入TLAB空间的单个对象的大小 | 64 | 表示使用约为1/64的TLAB空间作为refill_waste,默认情况下,TLAB和refill_waste都会在运行时不断调整的,使系统的运行状态达到最优。如果想要禁用自动调整TLAB的大小,可以使用-XX:-ResizeTLAB禁用ResizeTLAB,并使用-XX:TLABSize手工指定一个TLAB的大小 |
-XX:TLABWasteTargetPercent | 设置TLAB空间所占用Eden空间的百分比大小 | 1 | |
-XX:PrintTLAB | 查看TLAB空间的使用情况 | ||
-XX:ResizeTLAB | 自动调整TLABRefillWasteFraction阈值 | ||
-XX:+PrintTenuringDistribution | 用于显示每次minor GC(年轻代GC)时Survivor区中各个年临段的对象的大小 | ||
-XX:InitialTenuringThreshold | 年轻代对象转换为老年代对象最小年龄值 | 默认值为7 | 对象经过一次Minor GC后,如果没有被回收,年龄就加1,超过这个值,对象就会进入老年代 |
-XX:MaxTenuringThreshold | 年轻代对象转换为老年代对象最大年龄值 | 默认值为15 | |
-XX:ConcGCThreads | 并发GC的线程数量 | 默认值根据CPU的数量而定 |