JVM参数选项
标准参数选项
-
特点
- 稳定,后续版本不会变化
- 以【-】开头
-
各种选项
- 运行java或者java -help可以看到所有的标准选项
- 运行java或者java -help可以看到所有的标准选项
-
补充内容
- -server:64位机器上只支持Server模式的JVM,适用于需要大内存的应用程序,默认用并行垃圾回收器
- -client:在32位Windows系统上,默认使用Client类型的JVM,要想使用Server模式,则机器配置至少有2个以上的CPU和2G以上的物理内存。Client模式适用于对内存要求较小的桌面应用程序,默认使用Serial串行垃圾回收器
-X参数选项
-
特点
- 非标准化参数
- 功能相对稳定,官方说后续可能会变更
- 以-X开头
-
各种选项
- 运行java -X命令可以查看所有的X选项
- 运行java -X命令可以查看所有的X选项
-
JVM的JIT编译模式相关的选项
- -Xint:禁用JIT,所有字节码都被解释执行,这个模式的速度最慢
- -Xcomp:所有字节码第一次使用就都被编译成本地代码,然后再执行
- -Xmixed:混合模式,默认模式,让JIT根据程序的运行情况,有选择地将某些代码
-
特别
- -Xms:设置初始Java堆大小,等价于-XX:InitialHeapSize
- -Xmx:设置最大堆大小,等价于-XX:MaxHeapSize
- -Xss:设置Java线程堆栈大小,等价于-XX:ThreadStackSize
-XX参数选项
- 特点
- 非标准化参数
- 使用最多的类型
- 这类选项属于实验性,不稳定
- 以-XX开头
- 作用
- 用于开发和调试JVM
- 分类
- Boolean类型
- -XX:+表示启用option属性
- -XX:-表示禁用option属性
- 举例(-XX:+UseParallelGC启用并行收集器,-XX:+UseG1GC启用G1收集器,-XX:+UseAdaptiveSizePolicy自动选择年轻代区大小和相应的Survivor区比例)
- 有些指令默认是开启的,可以使用-关闭
- 非Boolean类型(key-value类型)
- 子类型1:数值型格式-XX:=
- 子类型2:非数值型格式-XX:=
- 举例(-XX:NewSize=1024m设置新生代初始大小为1024M,-XX:MaxGCPauseMillis=500 设置GC停顿时间:500毫秒,-XX:GCTimeRatio=19设置吞吐量,-XX:NewRatio=2设置新生代和老年代比例,-XX:HeapDumpPath=/usr/local/heapdump.hprof指定heap转储文件存储位置)
- Boolean类型
- 特别
- -XX:PrintFlagsFinal
- 输出所有参数的名称和默认值
- 默认不包括Dignostic和Experimental参数
- 可以配合-XX:+UnlockDiagnosticVMOptions和-XX:UnlockExperimentalVMOptions使用
- -XX:PrintFlagsFinal
添加JVM参数
Eclipse
IDEA
运行jar包
- java -Xms500m -Xmx500m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -jar demo.jar
通过Tomcat运行war包
- linux系统下,找到tomcat/bin/catalina.sh中添加JAVA_OPTS="-Xms500m -Xmx500m"
- windows系统下,找到catalina.bat不添加set "JAVA_OPTS=-Xms500m -Xmx500m"
程序运行过程中
- 使用jinfo -flag=设置非boolean类型参数
- 使用jinfo -flag[+|-]设置boolean类型参数
- 可以修改的参数见
常用的JVM参数
打印设置的XX选项及值
- -XX:+PrintCommandLineFlags:让程序运行前打印出用户手动设置或者JVM自动设置的XX选项
- -XX:+PrintFlagsInitial:打印出所有XX选项的默认值
- -XX:+PrintFlagsFinal:打印出XX选项在运行程序时生效的值
- -XX:+PrintVMOptions:打印JVM参数
堆、栈、方法区等内存大小设置
- 栈
- -Xss128k:每个线程的栈大小为128k
- 堆内存
- -Xms1024m:等价于-XX:InitialHeapSize,设置JVM初始堆内存为1024m
- -Xmx1024m:等价于-XX:MaxHeapSize,设置JVM最大堆内存为1024m
- -Xmn1g:设置年轻代大小为1G,官方建议设置整个堆大小的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:MaxTenuringThrehold=15
- 新生代每次MinorGC后,还存活的对象年龄+1,当对象的年龄大于设置的值时进入老年代
- 默认值15
- -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:UseCompressedSpaceSize:设置Klass Metadata的大小,默认1G
- 永久代
- 直接内存
- -XX:MaxDirectMemorySize:指定DirectMemory容量,若未指定,则默认与Java堆最大值一样
OutOfMemory相关选项
- -XX:HeapDumpOnOutOfMemoryError:内存出现OOM的时候,把Heap转存(dump)到文件方便后续分析
- -XX:HeapDumpBeforeFullGC:出现FullGC之前,生成Heap转储文件
- -XX:HeapDumpPath= :指定heap转存文件的存储路径
- -XX:OnOutOfMemoryError:指定一个可行性程序或者脚本的路径,当发生OOM时,去执行这个脚本
垃圾收集器相关选项
- 查看默认垃圾收集器
- -XX:+PrintCommandLineFlags:查看命令行相关参数(包含使用的垃圾收集器)
- 使用命令行指令:jinfo -flag 相关垃圾收集器参数 进程ID
- Serial回收器
- Serial收集器作为Hotspot中Client模式下的默认新生代垃圾收集器,Serial Old是运行在Client模式下默认的老年代垃圾回收器
- -XX:+UseSerialGC:指定年轻代和老年代都使用串行收集器,等价于新生代使用Serial GC,老年代使用Serial Old GC,可获得最高的单线程收集效率
- ParNew回收器
- -XX:+UseParNewGC:手动指定使用ParNew收集器执行内存回收任务,它表示年轻代使用并行收集器,不影响老年代
- -XX:ParallelGCThreads=N:限制线程数量,默认开启和CPU相同的线程数
- Parallel回收器
- CMS回收器
- JDK9 Deprecate
- JDK14 Remove
- G1回收器
- 如何选择垃圾回收器
GC日志相关选项
其他参数
通过Java代码获取JVM参数
持续更新中... ...