1.JVM参数选项类型
类型一:标准参数选项
特点:
比较稳定,后续版本基本不会变化,以-开头
各种选项:
运行java或者java -help可以看到所有的标准选项
类型二:-X参数选项
特点:
非标准化参数,功能还是比较稳定的。但是官方说后续版本可能会变更,以-X开头。
各种选项:
运行java -X命令可以看到所有的X选项。
JVM的JIT编译模式相关的选项:
-Xint:禁用JIT,所有字节码都被解释执行,这个模式的速度最慢的。
-Xcomp:所有字节码第一次使用就都被编译成本地代码,然后在执行。
-Xmixed:混合模式,默认模式,让JIT根据程序运行的情况,有选择的将某些代码块编译成本地代码。
特别的:
-Xms<size>:设置初始Java堆大小,等价于-XX:InitialHeapSize
-Xmx<size>:设置最大Java堆大小,等价于-XX:MaxHeapSize
-Xss<size>:设置初始Java线程堆栈大小,等价于-XX:ThreadStackSize
类型三:-XX参数选项
特点:
非标准化参数,使用的最多的参数类型,这类选项属于实验性,不稳定,以-XX开头。
作用:
用于开发和调试
分类:
1.Boolean类型格式:
-XX:+<option> 表示启用option属性
-XX:-<option> 表示禁用option属性
说明:因为有的指令默认是开启的,所以可以使用-关闭

2.非Boolean类型格式(key-value):
子类型1:数值格式-XX:<option>=<number>

子类型2:非数值格式-XX:<name>=<string>

特别的:
-XX:+PrintFlagsFinal 输出所有参数的名称和默认值,默认不包括Diagnostic和Experimental的参数,可以配合-XX:+UnlockDiagnosticVMOptions和-XX:UnlockExperimentalVMOptions使用。
2.添加JVM参数选项

3.常用的JVM参数选项
1.打印设置的XX选项及值
-XX:+PrintCommandLineFlags 可以让在程序运行前打印出用户手动设置或者JVM自动设置的XX选项。
-XX:+PrintFlagsInitial 表示打印出所有XX选项的默认值。
-XX:+PrintFlagsFinal 表示打印出XX选项在运行程序时生效的值。
-XX:+PrintVMOptions 打印JVM的参数
2.堆、栈、方法区等内存大小设置
栈:
-Xss128k:设置每个线程栈的大小,等价于-XX:ThreadStackSize=128k,一般很少设置
堆:
-Xms3550m 等价于-XX:InitialHeadSize,设置JVM初始堆内存为3550M。
-Xmx3550m 等价于-XX:MaxHeadSize,设置JVM最大堆内存为3550M ,一般跟上面参数设置一样。
-Xmn2g 设置年轻代大小为2g,官方推荐配置为整个堆大小的3/8。
-XX:NewSize=1024m 设置年轻代初始值为1024m。
-XX:MaxNewSize=1024m 设置年轻代最大值为1024m。
-XX:SurvivorRatio=8 设置年轻代中Eden区与一个Survivor区的比值,默认为8。
-XX:+UseAdaptiveSizePolicy 自动选择各区大小比例(默认开启,所以最好调优就是不动哈哈)
-XX:NewRadio=4 设置老年代与年轻代的比值。
-XX:PretenureSizeThreadshold=1024 设置让大于此阈值的对象直接分配在老年代,单位为字节。当然了只对Serial、ParNew收集器有效。
-XX:MaxTenuringThreshold=15 默认值为15,新生代每次MinorGC后,还存活的对象年龄+1,当对象的年龄大于设置的这个值时就进入老年代。
-XX:+PrintTenuringDistribution 让JVM在每次MinorGC后打印出当前使用的Survivor中对象的年龄分布。
-XX:TargetSurvivorRatio 表示MinorGC结束后Survivor区域中占用空间的期望比例。
方法区:
永久代(1.7及以前):
-XX:PermSize=256 设置永久代初始值为256m。
-XX:MaxPermSize=256m 设置永久代最大值为256m。
元空间(1.8及以后):
-XX:MetaspaceSize 初始空间大小。
-XX:MaxMetaspaceSize 最大空间,默认没有限制。
-XX:+UseCompressedOops 压缩对象指针。
-XX:+UseCompressedClassPointers 压缩类指针
-XX:CompressedClassSpaceSize 设置Klass Metaspace的大小,默认为1G
直接内存:
-XX:MaxDirectMemorySize 指定DirectMemory容量,若未指定,则默认与Java堆最大值一样。
3.OutOfMemory相关选项:
-XX:+HeapDumpOnOutOfMemoryError 表示在内存出现OOM的时候,把Heap转存到文件以便后续分析。
-XX:+HeapDumpBeforeFullGC 表示出现FullGC之前,生成Heap转储文件。
-XX:HeapDumpPath=<path> 指定转存文件的存储路径,与上面二选一指令一起使用,如果没有写,则生成的dump文件在当前路径下。
-XX:OnOutOfMemoryError 指定一个可行性程序或脚本的路径,当发生OOM的时候,去执行这个脚本。例如:-XX:OnOutOfMemoryError=/opt/Server/restart.sh 在出现OOM的时候,后面路径下的脚本。
4.垃圾收集器相关选项
-XX:+PrintCommandLineFlags 查看命令行相关参数(包含使用的垃圾收集器)
-XX:+UseSerialGC 指定年轻代和老年代都使用串行收集器。适合单核CPU的机器。不合适交互要求高的项目。
-XX:+UseParNewGC 指定ParNew收集器执行内存回收任务。不过后面版本基本没用了。
Parallel主打吞吐量:
-XX:+UseParallelGC 手动指定年轻代使用Parallel并行收集器执行内存回收任务。
-XX:+UseParalleOldGC 手动指定老年代都是使用并行回收收集器。(JDK1.8默认开启,与上一个新生代一起使用)
-XX:ParallelGCThreads=N 设置年轻代并行收集器的线程数。一般与CPU数量相等。
默认情况下,当CPU数量小于8,则设置N等于CPU数量。
当CPU数量大于8个,则设置N等于3+[5*CPU_Count]/8
-XX:MaxGCPauseMillis 设置垃圾收集器最大停顿时间(即STW)。单位是毫秒。改参数使用谨慎。
-XX:GCTimeRatio 垃圾收集时间占总时间的比列(1 / (N + 1))。用于衡量吞吐量的大小。默认值为99,也就是垃圾回收时间不超过1%。与前一个-XX:MaxGCPauseMillis参数有一定矛盾性。暂停时间越长,Radio参数就容易超过设定的比列。
-XX:+UseAdaptiveSizePolicy 设置Parallel Scavenge收集器具有自适应调节策略。
CMS回收器:jDK1.4中被删除了
-XX:+UseConcMarkSweepGC 手动指定使用GMS收集器执行内存回收任务。
开启该参数后会自动将-XX:UseParNewGC打开。即:ParNew(Young区用) + CMS(Old区用)+Serial Old 的组合。
G1回收器:主打低停顿
-XX:+UseG1GC 手动指定使用G1收集器执行内存回收任务。
-XX:G1HeapRegionSize 设置每个Region的大小。值是2的幂,范围四1MB到32MB之间,目标是根据最小的Java堆大小划分出约2048个区域。默认是堆内存的1/2000。
-XX:MaxGCPauseMillis 设置期望达到的最大GC停顿时间指标(JVM会尽力实现,但不保证达到)。默认值是200ms。
-XX:ParallelGCThreads 设置STW时GC线程数的值,最多设置为8。
-XX:ConcGCThreads 设置并发标记的线程数。将n设置为并行垃圾回收线程数(ParallelGCThreads)的1/4左右。
XX:InitiatingHeapOccupancyPercent 设置触发并发GC周期的Java堆占用率阈值。超过此值,就触发GC。默认值是45。
-XX:G1NewSizePercent、-XX:G1MaxNewSizePercent 新生代占用整个堆内存的最小百分比(默认为5%)、最大百分比(默认60%)。
-XX:G1ReservePercent=10 保留内存区域,防止to space(Survivor的to区)溢出
怎么选择垃圾回收器:

5.GC日志相关指令
常用参数:
-verbose:gc 输出gc日志信息,默认输出到标准输出
-XX:+PrintGC 等同于-verbose:gc 表示打开简化的GC日志。可以独立使用。
-XX:+PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存各区域分配情况。
-XX:+PrintGCTimeStamps 输出GC发生时的时间戳,要与-XX:+PrintGCDetails一起使用。
-XX:+PrintGCDateStamps 输出GC发生时的时间戳(以日期的形式),要与-XX:+PrintGCDetails一起使用。
-XX:+PrintHeapAtGC 每次GC前和后,都打印堆信息
-Xloggic:<file> 把GC日志写入到一个文件中去,而不是打印到标准输出中。
4.通过Java代码获取JVM参数
Java提供了java.lang.management包用于监视和管理Java虚拟机和Java运行时中的其他组件,它允许本地和远程监控和管理运行的Java虚拟机。其中ManagementFactory这个类还是挺常用额。另外还有Runtime类也可以获取一些内存、CPU核数等相关的数据。
通过这些api可以监控我们的应用服务器的堆内存使用情况,设置一些阈值进行报警等处理。

















