内存管理参数
本参数以JDK1.8为基础进行整理,目前默认参数大概有660个左右,使用java -XX:+PrintFlagsFinal -version
可以输出所有参数的名称及默认值
名词解释
-XX:开头的参数代表虚拟机非稳定参数
-XX:+ 开启option参数
-XX:- 关闭option参数
-XX:= 将option参数的值设置为value
JVM设置经验
- 客户端应用
-Xverify:none
-XX:+UseG1GC
-XX:MinHeapFreeRatio=10
-XX:MaxHeapFreeRatio=15
-Djava.net.preferIPv4Stack=true
-Xms192m
-Xmx1200m
- 开发过程的测试应用,要求物理内存大于 4G
-Xmx3550m
-Xms3550m
-Xmn2g
-Xss128k
- 高并发本地测试使用,大对象相对较多(如 IO 流)
Xmx3550m
-Xms3550m
-Xss128k
-XX:NewRatio=4
-XX:SurvivorRatio=4
-XX:MaxPermSize=160m
-XX:MaxTenuringThreshold=0
- 环境: 16G 物理内存,高并发服务,重量级对象中等(线程池,连接池等),常用对象比例为 40%(即运行过程中产生的对象 40% 是生命周期较长的)
-Xmx10G
-Xms10G
-Xss1M
-XX:NewRatio=3
-XX:SurvivorRatio=4
-XX:MaxPermSize=2048m
-XX:MaxTenuringThreshold=5
配置参数
内存管理参数
参数 |
默认值 |
使用说明 |
-Xmx |
默认的最大堆大小是物理内存的一半,直到物理内存大小为192兆字节(MB),否则为物理内存的四分之一,物理内存大小为1千兆字节(GB) |
最大堆大小,如果初始堆空间不足的时候,最大可以扩展到多少 |
-Xms |
无默认值 |
初始堆大小,JVM 启动的时候,给定堆空间大小。 |
-Xmn |
见描述-》 |
设置年轻代大小。整个堆大小 = 年轻代大小 + 年老代大小 + 持久代大小 。持久代一般固定大小为 64M,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun 官方推荐配置为整个堆的3/8 |
-Xss |
JDK5后默认为1MB |
设置每个线程Java栈的大小,减少这个值能生成更多的线程,但是在操作系统对单个进程中线程数量有限制,无法无限制生成,经验值在 3000~5000 左右 |
-XX:MaxNewSize |
|
新生成对象能占用内存的最大值 |
-XX:MaxMetaspaceSize |
JDK1.8中做的调整,默认0,受系统内存限制 |
大小不受堆限制,仅受系统内存限制,用于保存系统的类信息,比如类的字段、方法、常量池等 |
-XX:NewRatio |
老年代默认64MB,其余的为年轻代 |
设置年轻代和年老代的比值。如为 3,表示年轻代与年老代比值为 1:3 |
-XX:MaxTenuringThreshold |
默认值15 |
晋升到老年代的对象年龄。每个对象在坚持过一次Minor GC之后,年龄就+1,当超过这个参数时就进入老年代 |
-XX:PretenureSizeThreshold |
无默认值 |
直接晋升到老年代的对象的大小,设置这个参数后,大于这个参数的对象将直接在老年代分配 |
-XX:+UseAdaptiveSizePolicy |
默认开启 |
动态调整Java堆中各个区域的大小及进入老年代的年龄 |
-XX:MaxHeapFreeRatio |
默认值70 |
当Xmx值比Xms值大时,堆可以动态收缩和扩展,这个参数控制当前堆空闲大于指定比率时自动收缩,在客户端限制进行内存很有用 |
-XX:MinHeapFreeRatio |
默认值70 |
当Xmx值比Xms值大时,堆可以动态收缩和扩展,这个参数控制当前堆空闲小于指定比率时自动扩展 |
-XX:MaxPermSize |
大部分情况下默认值时64MB |
永久代的最大值 |
-XX:MaxDirectMemorySize |
|
直接内存的内存大小 |
-XX:SurvivorRatio |
默认为8 |
新生代中Eden区域与Survivor区域的容量比值 |
-XX:+HandlePromotionFailure |
JDK1.5以前默认关闭,之后默认开启 |
是否允许分配担保失败,即老年代的剩余空间不足以应付新生代的整个Eden和Survivor区的所有对象都存活的极端情况 |
-XX:+UserTLAB |
Server模式默认开启 |
优先在本地线程缓冲区中分配对象,避免分配内存时的锁定过程 |
收集器设置
参数 |
默认值 |
使用说明 |
-XX:+DisableExplicitGC |
默认关闭 |
忽略来自System.gc()方法触发的垃圾收集 |
-XX:+ExplicitGCInvokes Concurrent |
默认关闭 |
当收到System.gc()方法提交的垃圾收集申请时,使用CMS收集器进行收集 |
-XX:+UseSerialGC |
Client模式的虚拟机默认开启,其它模式关闭 |
虚拟机在Client模式下的默认值,打开此开关后,使用Serial + Serial Old 的收集器组合进行内存回收 |
-XX:+UseParNewGC |
默认关闭 |
打开此开关后,使用ParNew + Serial Old的收集器组合进行内存回收 |
-XX:+UseConcMarkSweepGC |
默认关闭 |
打开此开关后,使用ParNew + CMS +Serial Old的收集器组合进行内存回收。如果CMS收集器出现Concurrent Mode Failure,则Serial Old收集器左右后备(备用)收集器 |
-XX:+UseParallelGC |
Server模式的虚拟机默认开启,其它模式关闭 |
虚拟机运行在Server模式下的默认值,打开此开关后,使用Parallel Scavenge + Serial Old的收集器组合进行内存回收 |
-XX:+UseParalledlOldGC |
默认关闭 |
打开此开关后,使用Parallel Scavenge + Parallel Old的收集器组合内存回收 |
-XX:+UseConcMarkSweepGC |
|
设置并发收集器 |
-XX:+UseG1GC |
默认关闭,JDK1.7中新的收集器 |
设置 G1 收集器 |
-XX:+UseAdaptiveSizePolicy |
|
设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例 |
-XX:CMSInitialingOccupancyFraction |
默认值为68 |
设置CMS收集器在老年代空间被是哟个多少后触发垃圾收集,仅在使用CMS收集器时生效 |
-XX:+UseCMSCompactAtFullCollection |
默认开启 |
设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片整理。仅在CMS收集器时生效 |
-XX:CMSFullGCsBeforeCompaction |
无默认值 |
设置CMS收集器在进行若干次垃圾收集后再启动一次内存碎片整理。仅在使用CMS收集器时生效 |
-XX:+ScavengeBeforeFullGC |
默认开启 |
在Full GC发生之前触发一次 Minor GC |
-XX:+UseGCOverheadLimit |
默认开启 |
禁止GC过程无限制地执行,如果过于频繁,就直接发生OutOfMemory异常 |
-XX:ParallelGCThreads |
少于或等于8个CPU时默认值为CPU数量值,多余8个时比CPU数量值小 |
设置并行GC时进行内存回收的线程数 |
-XX:MaxGCPauseMillis |
无默认值 |
设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。仅在使用Parallel Scavenge收集器时生效 |
-XX:GCTimeRatio |
默认值99 |
GC时间占总时间的比率,默认值99,即允许1%的GC时间。仅在使用Parallel Scavenge收集器时生效,公式为1/(1+n) |
-XX:+CMSIncrementalMode |
|
设置为增量模式。适用于单CPU情况。 |
-XX:NativeMemoryTracking=[off |
summary |
detail] |
行为参数(功能开关)
参数 |
默认值 |
使用说明 |
-XX:+UseThreadPriorities |
|
启用本地线程优先级 |
-Dcom.sun.management.jmxremote |
默认未开启 |
开启jmx远程监控 |
垃圾回收统计信息
参数 |
默认值 |
使用说明 |
-verbose:gc |
|
输出虚拟机中GC的详细情况 |
-XX:+PrintGC |
|
与-verbose:gc 一样,同样效果 |
-XX:+PrintGCDetails |
|
打印GC详细信息 |
-XX:+PrintGCTimeStamps |
|
打印CG发生的时间戳 |
-Xloggc:filename |
|
将每次GC事件的相关情况记录到一个文件中 |
即时编译参数
参数 |
默认值 |
使用说明 |
-XX:CompileThreshold |
Client模式下默认值是1500,Server模式下是10000 |
触发方法即时编译的阈值 |
-XX:OnStackReplacePercentage |
Client模式下默认值是933,Server模式下是140 |
OSR比率,它是OSR即时编译阈值计算公式的一个参数,用于代替BackEdgeThreshold参数控制回边计数器的实际溢出阈值 |
-XX:ReservedCodeCacheSize |
大部分情况下默认值是32MB |
即时编译器编译的代码缓存的最大值 |
类型加载参数
参数 |
默认值 |
使用说明 |
-XX:+UseSplitVerifier |
默认开启 |
使用依赖StackMapTable信息的类型检查代替数据流分析,以加快字节码校验速度 |
-XX:+FailOverToOldVerifier |
默认开启 |
当类型校验失败时,是否允许回到老的类型推导校验方式进行校验,如果开启则允许 |
-XX:+RelaxAccessControlCheck |
默认关闭 |
在校验阶段放松对类型访问性的限制 |
多线程参数
参数 |
默认值 |
使用说明 |
-XX:+UseSpinning |
JDK1.6默认开启,JDK 1.5默认关闭 |
开启自旋锁以避免线程频繁的挂起和唤醒 |
-XX:PreBlockSpin |
默认值为10 |
使用自旋锁时默认的自旋次数 |
-XX:+UseThreadPriorities |
默认开启 |
使用本地线程优先级 |
-XX:+UseBiasedLocking |
默认开启 |
是否使用偏向锁,如果开启则使用. |
-XX:+UseFastAccessorMethods |
默认开启 |
当频繁反射执行某个方法时,生成字节码来加快反射的执行速度 |
性能参数
参数 |
默认值 |
使用说明 |
-Xverify |
默认开启 |
设置为none,可以加快来的加载速度,提高启动速度 |
-XX:+AggressiveOpts |
JDK1.6默认开启,JDK1.5默认关闭 |
使用激进的优化特性,这些特性一般是具备正面和负面双重影响的,需要根据具体应用特点分析才能判定是否对性能有好处 |
-XX:+UseLargePages |
默认开启 |
如果可能,使用大内存分页,这项特性需要操作系统的支持 |
-XX:LargePageSizeInBytes |
默认为4MB |
使用指定大小的内存分页,这项特性需要操作系统的支持 |
-XX:+StringCache |
默认开启 |
是否使用字符串缓存,开启则使用 |
调试参数
参数 |
默认值 |
使用说明 |
-XX:OnOutOfMemoryError |
无默认值 |
当虚拟机抛出内存溢出异常时,执行指定的命令 |
-XX:OnError |
无默认值 |
当虚拟机抛出ERROR异常时,执行指定的命令 |
-XX:+PrintClassHistogram |
默认关闭 |
使用[ctrl]-[break]快捷键输出类统计状态,相当于jmap -histo的功能 |
-XX:+PrintConcurrentLocks |
默认关闭 |
打印JU.C中锁的状态 |
-XX:+PrintCommandLineFlags |
默认关闭 |
打印启动虚拟机时输入的非稳定参数 |
-XX:+PrintCompilation |
默认关闭 |
打印方法即时编译信息 |
-XX:+PrintGC |
默认关闭 打印GC信息 |
|
-XX:+PrintGCDetails |
默认关闭 |
打印GC的详细信息 |
-XX:+PrintGCTimeStamps |
默认关闭 |
打印GC停顿耗时 |
-XX:+PrintTenuringDistribution |
默认关闭 |
打印GC后新生代各个年龄对象的大小 |
-XX:+TraceClassLoading |
默认关闭 |
打印类加载信息 |
-XX:+TraceClassUnloading |
默认关闭 |
打印类卸载信息 |
-XX:+PrintInlining’ |
默认关闭 |
打印方法的内联信息 |
-XX:+PrintCFGToFile |
默认关闭 |
将CFG图信息输出到文件,只有DEBUG版虚拟机才支持此参数 |
-XX:+PrintIdcalGraphFile |
默认关闭 |
将ldeal图信息输出到文件,只有DEBUG版虚拟机才支持此参数 |
-XX:+UnlockDiagnosticVMOptions |
默认关闭 |
让虚拟机进入诊断模式,一些参数(如PrintAssembly)需要在诊断模式中才能使用 |
-XX:+PrintAssembly |
默认关闭 |
打印即时编译后的二进制信息 |
总结
标红的代表重要的参数,但各个参数还需要依据实际情况进行测试,才能得出最好配置值
参考
《实战JAVA虚拟机 JVM故障诊断与性能优化》
《深入理解Java虚拟机:JVM高级特性与最佳实践》
原创不易,如果您觉得有用,记得一键三连哟