参数分类
标准参数
以 - 开头所有的JVM实现都必须实现这些参数的功能,且向后兼容
控制台 java -help 可以列出标准参数
非标准参数
以-X开头默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足
且不保证向后兼容
控制台 java -X 列出非标准参数
非稳定参数
以 -XX 开头此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用
输出当前程序jvm参数
ManagementFactory.getRuntimeMXBean().getInputArguments()
常用参数
现在基本都是jdk1.8及以上,就不具体指定那个版本了,1.8及以上都能使用
内存相关参数:
参数 | 含义 | 默认值 | 描述 |
---|---|---|---|
-Xms | 初始堆大小 也是最小值 | 系统内存1/64(<1G) | 堆内存占用超过40%,自动增长,直到最大堆内存, 当堆内存空余超过70% 自动减少,知道最小堆内存 可通过 -XX:MaxHeapFreeRation 参数调整比例 Server端JVM最好将-Xms和-Xmx设为相同值 避免每次垃圾回收完成后JVM重新分配内存 本地操作一般默认就好 |
-Xmx | 最大堆内存 | 系统内存1/4(<1G) | 一般设置为老年代存活对象的3-4倍,即FullGC之后的 老年代内存占用的3-4倍,本地自己玩设置个2-4G左右 |
-Xmn | 年轻代堆大小 | 默认堆内存1/3 | eden+ 2survivor区总和(8:1:1),年轻代增大, 对应老年代会变小,慎重调整 sun官方推荐为堆大小的 3/8, 所以和默认差不太多 |
-Xss | 每个线程的堆栈大小 | 默认1M | Java每个线程的堆栈大小。根据应用的 线程所需内存大小进行调整。在相同物理内存下 减小这个值能生成更多的线程。但是操作系统对一个 进程内的线程数还是有限制的,不能无限生成, 经验值在3000~5000左右。推荐默认(视情况定) |
-XX:NewSize | 设置年轻代大小 | 应该小于-Xms的值,一般-Xmn代替 | |
-XX:MaxNewSize | 最大年轻代大小 | 需要小于-Xmx的值,一般-Xmn代替 | |
-XX:MetaspaceSize | 元空间初始大小 | 20.75MB(64位jvm) | 1.8才有,1.8以下是永久代大小设置,不做描述 |
-XX:MaxMetaspacesSize | 元空间最大 | 理论无限大 | 一般和初始大小一致,常用200-300M |
-XX:ThreadStackSize | 线程堆栈大小 | 和 -Xss效果一样,推荐-Xss | |
-XX:NewRatio | 年轻代与老年代比例 | -XX:NewRatio=4 ,新生代老年代比例:1:4 则 新生代占堆空间1/5,一般不设置,与老年代比例 1:2 | |
-XX:SurvivorRatio | eden与survivor比例 | 设置 8 两个s与eden比例2:8 一个s区则1:8(其他值不准确) 实测: 年轻代设置100M,下面是值的对比,和 想象中不一样(一般也不建议设置该参数) | |
-XX:MaxTenuringThreshold | 最大年龄 | 15 | 经历15次还没有被回收进入老年代,为0 直接进入老年代,参考:jvm误区--动态对象年龄判定 - 简书 一般不设置 |
-XX:PretenureSizeThreshold | 对象多大直接分配老年代 | 0 | 默认值为0,即在旧一代中不直接创建任何对象 请谨慎使用此选项,因为它会降低性能而不是改进性能 |
-XX:TLABWasteTargetPercent | TLAB占eden区得百分比 | 默认:1% | |
-XX:+CollectGenOFirst | FullGC是否先YoungGC | false |
CMS相关参数
参数 | 含义 | 默认值 | 描述 |
---|---|---|---|
-XX:+UseConcMarkSweepGC | 老年代采用CMS收集器收集 | false | true 开启CMS |
-XX:+UseCMSCompactAtFullCollection | FullGC时压缩 | false | 对老年代进行压缩,可以消除碎片,但是可能会带来性能消耗(标记清除算法) |
-XX:CMSFullGCsBeforeCompaction | 多少次后内存压缩 | CMS进行n次full gc后进行一次压缩。如果n=0,每次full gc后都会进行碎片压缩 | |
-XX:CMSIncrementalMode | 增量模式 | false | 并发收集递增进行,周期性把cpu资源让给正在运行的应用 |
-XX:+CMSIncrementalPacing | 启用自动起搏 | false | 根据应用程序的行为自动调整每次执行的垃圾回收任务的数量 |
-XX:CMSIncrementalDutyCycleMin | 0 | 每次增量回收垃圾,占总垃圾回收任务的最小比例 | |
-XX:CMSIncrementalDutyCycle | 10 | 每次增量回收垃圾,占总垃圾回收任务的比例 | |
-XX:CMSInitiatingOccupancyFractio | 老年代多少百分比触发FullGC | -1 | 如果CMSInitiatingOccupancyFraction在0~100之间,那么由CMSInitiatingOccupancyFraction决定。 否则由按 ((100 - MinHeapFreeRatio) + (double)( CMSTriggerRatio * MinHeapFreeRatio) / 100.0) / 100.0 决定 1.6后默认92%,参考-XX:CMSInitiatingOccupancyFraction_每天进步一点点的专栏-CSDN博客_cmsinitiatingoccupancyfraction |
-XX:CMSMaxAbortablePrecleanTime | 5000 | 在CMS的预清理阶段开始前,等待minor gc的最大时间 |
G1相关参数
参数 | 含义 | 默认值 | 描述 |
---|---|---|---|
-XX:+UseG1GC | 使用G1做为GC收集器 | 1.8+ | 在1.8+后默认使用,其在大内存情形下能够发挥更加卓越的性能(详细参考本人得垃圾回收器详解) |
-XX:+PrintAdaptiveSizePolicy | 自动调节新生代老年代 | 自适应策略,调节Young Old Size,一般G1不会设置新生代和老年代大小,而有G1根据停顿时间逐渐调整新生代和老年代的空间比例 | |
-XX:G1ReservePercent | G1为分配担保预留的空间比例 | 10 | 预留10%的内存空间,应对新生代的分配担保情形 |
-XX:InitiatingHeap OccupancyPercent | 启动并发GC时的堆内存占用百分比 | 45 | G1用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比例。值为 0 则表示“一直执行GC循环)’. 默认值为 45 (例如, 全部的 45% 或者使用了45%). |
-XX:G1HeapRegionSize | G1内堆内存区块大小 | (Xms + Xmx ) /2 / 2048,不大于32M,不小于1M,且为2的指数 | G1将堆内存默认均分为2048块,1M<region<32 M,当应用频繁分配大对象时,可以考虑调整这个阈值,因为G1的Humongous区域只能存放一个大对象,适当调整Region大小,尽量让其刚好超过大对象的两倍大小,这样就能充分利用Region的空间 |
-XX:GCTimeRatio | GC时间占运行时间的比例 | G1为9,CMS为99 | GC时间占总时间的比例,默认值为99,即允许1%的GC时间。仅仅在Parallel Scavenge收集时有效,公式为1/(1+n) |
-XX:G1HeapWastePercent | 触发Mixed GC的可回收空间百分比 | 5% | 在全局并发标记结束之后,我们可以知道老年代regions中有多少空间要被回收,在每次YGC之后和再次发生Mixed GC之前,会检查垃圾占比是否达到此参数,只有达到了,下次才会发生Mixed GC |
-XX:G1MixedGCLive ThresholdPercent | 会被MixGC的Region中存活对象占比 | 85% | 老年代region中的存活对象的占比,只有小于此参数,才会被选入CSet(记忆集合) |
-XX:G1MixedGCCountTarget | 8 | 一次全局并发标记结束之后,最多执行Mixed GC的次数 | |
-XX:G1NewSizePercent | 新生代占堆的最小比例 | 5% | |
-XX:G1MaxNewSizePercent | 新生代占堆的最大比例 | 60% | |
-XX:GCPauseIntervalMillis | 指定最短多长可以进行一次gc | ||
-XX:G1OldCSetRegion ThresholdPercent | Mixed GC每次回收Region的数量比例 | 10% | 一次Mixed GC中能被选入CSet的最多old generation region数量比列 |
-XX:ParallelGCThreads | STW期间,并行GC线程数 | ||
-XX:ConcGCThreads | 并发标记阶段,并行执行的线程数 |
调优或其他常用参数
参数 | 含义 | 默认值 | 描述 |
---|---|---|---|
-XX:+PrintGC | GC时打印概览信息 | 关闭 | [GC (Allocation Failure) 74613K->19143K(183296K), 0.0047467 secs] |
-XX:HeapDumpPath | 堆内存快照到处路径 | 指定HeapDump的文件路径或目录,使用前需开启HeapDumpOnOutOfMemoryError | |
-XX:+HeapDumpOnOutOfMemoryError | 在OOM后导出堆内存快照 | 默认关闭 | |
-XX:OnError | 在Error时执行操作 | 可配置相应命令,在Error时执行此命令,比如发送邮件 | |
-XX:OnOutOfMemoryError | 在发生OOM时执行操作 | ||
-XX:+PrintCommandLineFlags | 打印jvm参数 | 在程序运行前打印出用户手动设置或者JVM自动设置的XX选项 | |
-XX:+PrintGCDetails | GC时打印详细信息 | 关闭 | |
-XX:+PrintGCTimeStamps | 打印GC用时 | 关闭 | |
-XX:+PrintGCApplicationStoppedTime | 打印GC时应用暂停时间 | 关闭 | |
-Xloggc:< filename> | 将GC相关日志记录到文件以便分析 | ||
-XX:GCLogFileSize | 8K | 使用前需开启-Xloggc,GC日志文件默认大小,当日志超过8K时需要被滚动存储 | |
-XX:+UseGCLogFileRotation | 关闭 | 开启GC日志文件的滚动存储功能 | |
-XX:NumberOfGCLogFiles | GC文件数量 | 1 | GC日志滚动文件数量,超过时会删除最先创建的 |
-XX:+CITime | 关闭 | 打印启动时花费在JIT 编译器时 |
一些常用或者需要了解得参数暂时记录到这儿,后续可能还会有新增得记录,方便日后学习和工作中使用