1.JVM参数选项类型:
类型一:标准参数选项:
特点: 比较稳定,后续版本基本不会变化,以 - 开头。
各种选项的解释及用法如下图所示,运行Java/java -help 可以参看所有标准选项。
补充内容:-server 与 -client
类型二:-X参数选项:
特点: 非标准化参数,功能还是比较稳定的,但是官方说可能会变更,以 -X 开头。
各种选项的解释及用法如下图所示,运行java -X 可以参看所有的 X选项。
JVM的JIT编译模式相关选项:
-Xint:禁用JIT,所有字节码都会被解释执行,速度最慢。
-Xcomp:所有字节码第一次使用就被编译成本地代码,然后再执行。
-Xmixed:混合模式,默认模式。
特别地:
-Xmx -Xms -Xss 属于 XX 参数?-Xms 设置初始 Java堆大小,等价于 -XX:InitialHeapSize;-Xmx 设置最大 Java堆大小,等价于-XX:MaxHeapSize;-Xss 设置 Java线程堆栈大小,等价于-XX:ThreadStackSize。
类型三:-XX参数选项:
特点: 非标准化参数,使用最多的参数类型,属于实验性选项,不稳定,以 -XX 开头。
作用: 用于开发和调试JVM。
分类: Boolean类型格式、非Boolean类型格式(key-value类型)。
Boolean类型格式:
-XX:+<参数> 表示启用参数属性。
-XX:-<参数> 表示禁用参数属性。
举例:-XX:-UseParallelGC 不使用并行垃圾收集器,-XX:+UseG1GC 启用G1垃圾收集器,-XX:+UseAdaptiveSizePolicy 自动选择年轻代区大小和相应的Survivor区比例。说明: 因为有的指令默认开启,所以可以使用 - 关闭,-XX:-UseParallelGC 不使用并行垃圾收集器。
非Boolean类型格式:
子类型1: 数值型格式 -XX:<参数>=<数字>
子类型2: 非数值型格式 -XX:<名字>=<字符串>
特别地: -XX:+PrintFlagFinal,输出所有参数的名称和默认值,默认不包括 Diagnostic 和 Experimental 的参数,可以配合 -XX:+UnlockDiagnosticVMOptions 和 -XX:UnlockExperimentalVMOptions 使用。
2.添加JVM参数选项
运行jar包:java -Xms50m -Xmx50m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -jar demo.jar 。
通过tomcat运行war包:①Linux系统下可以在tomcat/bin/catalina.sh中添加如下配置:JAVA_OPTS=“-Xms512M -Xmx512M”。②Windows系统下在catalina.bat中添加如下配置:set “JAVA_OPTS=-Xms512M -Xmx512M”。
程序运行过程中:①使用jinfo -flag <参数名>=<参数值> <进程id> 设置非Boolean类型参数。②使用jinfo -flag [+|-] <参数名> <进程id> 设置Boolean类型参数。
3.常用的JVM参数选项
打印设置的XX选项及值:①-XX:+PrintCommandLineFlags:程序运行前打印用户手动设置或者JVM自动设置的XX选项。②-XX:+PrintFlagsInitial:打印所有XX选项的默认值。③-XX:+PrintFlagsFinal:打印XX选项在运行程序时生效的值。④-XX:PrintVMOptions:打印JVM的参数。
3.1.堆、栈、方法区等内存大小设置:
①栈:-Xss128k–设置每个线程的栈大小为128k,等价于-XX:ThreadStackSize=128k。
②堆内存:
-Xms3550m:等价于-XX:InitialHeapSize,设置JVM初始内存为3550M。
-Xmx3550m:等价于-XX:MaxHeapSize,设置JVM最大内存为3550M。
-Xmn2g:设置年轻代大小为2G,官方推荐配置为整个堆大小的3/8。
-XX:NewSize=1024m:设置年轻代初始值为1024M。
-XX:MaxNewSize=1024m,设置年轻代最大值为1024M。
-XX:SurvivorRatio=8,设置年轻代中Eden区与一个Survivor区的比值,默认为8。
-XX:+UseAdaptiveSizePolicy:自动选择各区大小比例。
-XX:NewRatio=4:设置老年代与年轻代(包括1个Eden和2个Survivor区)的比值。
-XX:PretenureSizeThreadshold=1024,设置让大于此阈值的对象直接分配在老年代,单位为字节,只对Serial、ParNew收集器有效。
-XX:MaxTenuringThreshold=15:默认值为15,新生代每次MinorGC后,还存活的对象年龄+1,当对象的年龄大于设置的这个值时就进入老年代。
-XX:+PrintTenuringDistribution:让JVM在每次MinorGC后打印出当前使用的Survivor中对象的年龄分布。
-XX:TargetSurvivorRatio:表示MinorGC结束后Survivor区域中占用空间的期望值比例。
③方法区:
永久代:-XX:PermSize=256m:设置永久代初始值为256M;-XX:MaxPermSize=256m:设置永久代最大值为256M。
元空间:
-XX:MetaspaceSize:初始空间大小;-XX:MaxMetaspaceSize:最大空间大小,默认没有限制。
-XX:+UseCompressedOops:压缩对象指针。
-XX:+UseCompressedClassPointers:压缩类指针。
-XX:CompressedClassSpaceSize:设置class matespace的大小,默认为1G。
④直接内存:-XX:MaxDirectMemorySize,指定DirectMemory容量,若未指定,则默认与Java堆最大值一样。
3.2.OutOfMemory相关的选项:
-XX:+HeapDumpOnOutOfMemoryError:表示在内存出现OOM的时候,把Heap转存(Dump)到文件,以便后续分析。
-XX:+HeapDumpBeforeFullGC:表示在出现FullGC之前,生成Heap转储文件。
-XX:HeapDumpPath=<路径>:指定heap转存文件的存储路径。
-XX:OnOutOfMemoryError:
指定一个可行性程序或者脚本的路径,当发生OOM的时候,去执行此脚本。
3.3.垃圾收集器相关选项:
查看默认的垃圾收集器:-XX:+PrintCommandLineFlags:查看命令行相关参数(包含使用的垃圾收集器),使用命令行指令:jinfo -flag 相关垃圾回收器参数 进程ID。
①Serial垃圾回收器:
②ParNew垃圾回收器:
③Parallel垃圾回收器:
④CMS垃圾回收器:
补充参数:
特别说明:
⑤G1垃圾回收器:
Mixed GC调优参数:
⑥如何选择垃圾回收器:
3.4.GC日志相关选项:
3.4.1.常用参数:
①-verbose:gc 输出gc日志信息,默认输出到标准输出。可独立使用。
②-XX:+PrintGC 等价于 -verbose:gc,表示打开简化的GC日志。 可独立使用。
③-XX:+PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存各区域分配情况。可独立使用。
④-XX:PrintGCTimeStamps 输出GC发生时的时间戳。不可独立使用,需配合-XX:+PrintGCDetails使用。
⑤-XX:+PrintGCDateStamps 输出GC发生时的时间戳(以日期的形式,如2025-01-01T10:10:10.249+0800)。不可独立使用,需配合-XX:+PrintGCDetails使用。
⑥-XX:+PrintHeapAtGC 每一次GC前和GC后,都打印堆信息,可独立使用。
⑦-Xloggc:<文件> 把GC日志写入到一个文件中,而不是打印到标准输出中。
3.4.2.其他参数:
3.5其他参数:
4.通过Java代码获取JVM参数
通过Runtime获取: