打印设置的XX选项及值

-XX:+PrintCommandLineFlags 可以让程序运行前打印出用户手动设置或者JVM自动设置的XX选项
-XX:+PrintFlagsInitial 表示打印出所有XX选项的默认值
-XX:+PrintFlagsFinal 表示打印出XX选项在运行程序时生效的值
如果值的前面加上了:=,说明该值不是初始值,该值可能被jvm自动改变了,也可能被我们设置的参数改变了,如下所示:
image.png
-XX:+PrintVMOptions: 打印JVM的参数

使用

image.png

程序跑起来就能看到自己设置的值了, 等号前面有个冒号的意思是 这个值被重新赋值过
image.png


查看设置,23508是程序的pid
image.png

堆、栈、方法区等内存大小设置

平时我们设置栈比较少,因为栈不涉及到GC的行为,栈溢出的情况比较少.

-Xss128k
等价于-XX:ThreadStackSize,设置每个线程的栈大小为128k

堆内存

-Xms3550m
等价于-XX:InitialHeapSize,设置JVM初始堆内存为3500M
-Xmx3550m
等价于-XX:MaxHeapSize,设置JVM最大堆内存为3500M
-Xmn2g
设置年轻代大小为2G,即等价于-XX:NewSize=2g -XX:MaxNewSize=2g,也就是设置年轻代初始值和年轻代最大值都是2G
官方推荐配置为整个堆大小的3/8
-XX:NewSize=1024m
设置年轻代初始值为1024M
-XX:MaxNewSize=1024m
设置年轻代最大值为1024M
-XX:SurvivorRatio=8
设置年轻代中Eden区与一个Survivor区的比值,默认为8
只有显示使用Eden区和Survivor区的比例,才会让比例生效,否则比例都会自动设置,至于其中的原因,请看下面的-XX:+UseAdaptiveSizePolicy中的解释,最后推荐使用默认打开的-XX:+UseAdaptiveSizePolicy设置,并且不显示设置-XX:SurvivorRatio

-XX:+UseAdaptiveSizePolicy
自动选择各区大小比例,默认开启,如果UseAdaptiveSizePolicy开启状态,会自动进行对eden区和survivo区比例分配,这样 -XX:SurvivorRatio配置的参数就失效了, 推荐UseAdaptiveSizePolicy参数打开

1、分析
默认开启,将会导致Eden区和Survivor区的比例自动分配,因此也会引起我们默认值-XX:SurvivorRatio=8失效,所以真实比例可能不是8,比如可能是6等
2、如何设置Eden区和Survivor区的比例
-XX:SurvivorRatio=8
显示使用Eden区和Survivor区的比例,那就使用我自己的
没有显示使用Eden区和Survivor区的比例,无论打开或者关闭-XX:+UseAdaptiveSizePolicy,都会自动设置Eden区和Survivor区的比例

结论:
只有显示使用Eden区和Survivor区的比例,才会让比例生效,否则比例都会自动设置,最后推荐使用默认打开的-XX:+UseAdaptiveSizePolicy设置,并且不显示设置-XX:SurvivorRatio

-XX:NewRatio=2
设置老年代与年轻代(包括1个Eden区和2个Survivor区)的比值,默认为2
根据实际情况进行设置,主要根据对象生命周期来进行分配,如果对象生命周期很长,那么让老年代大一点,否则让新生代大一点

-XX:PretenureSizeThreadshold=1024
设置让大于此阈值的对象直接分配在老年代,单位为字节
只对Serial、ParNew收集器有效
不好控制

-XX:MaxTenuringThreshold=15
默认值为15
新生代每次MinorGC后,还存活的对象年龄+1,当对象的年龄大于设置的这个值时就进入老年代
使用比较少,一般用默认值

-XX:+PrintTenuringDistribution
让JVM在每次MinorGC后打印出当前使用的Survivor中对象的年龄分布

-XX:TargetSurvivorRatio
表示MinorGC结束后Survivor区域中占用空间的期望比例

方法区

永久代

  1. -XX:PermSize=256m<br /> 设置永久代初始值为256M<br /> -XX:MaxPermSize=256m<br /> 设置永久代最大值为256M

元空间

  1. -XX:MetaspaceSize<br /> 初始空间大小<br /> -XX:MaxMetaspaceSize<br /> 最大空间,默认没有限制<br /> -XX:+UseCompressedOops<br /> 使用压缩对象指针<br /> -XX:+UseCompressedClassPointers<br /> 使用压缩类指针<br /> -XX:CompressedClassSpaceSize<br /> 设置Klass Metaspace的大小,默认1G

直接内存

-XX:MaxDirectMemorySize
指定DirectMemory容量,若未指定,则默认与Java堆最大值一样

OutOfMemory相关的选项

-XX:+HeapDumpOnOutMemoryError(在出现OOM的时候
生成dump文件)和-XX:+HeapDumpBeforeFullGC(在出现Full GC的时候生成dump文件)只能设置1个
,如果不设置-XX:HeapDumpPath=,那么将会在当前目录下生成dump文件,如果设置的话,将会在指定位置生成dump文件


-XX:+HeapDumpOnOutMemoryError
表示在内存出现OOM的时候,生成Heap转储文件,以便后续分析,-XX:+HeapDumpBeforeFullGC和-XX:+HeapDumpOnOutMemoryError只能设置1个

-XX:+HeapDumpBeforeFullGC
表示在出现FullGC之前,生成Heap转储文件,以便后续分析,-XX:+HeapDumpBeforeFullGC和-XX:+HeapDumpOnOutMemoryError只能设置1个,请注意FullGC可能出现多次,那么dump文件也会生成多个

-XX:HeapDumpPath=
指定heap转存文件的存储路径,如果不指定,就会将dump文件放在当前目录中

-XX:OnOutOfMemoryError
指定一个可行性程序或者脚本的路径,当发生OOM的时候,去执行这个脚本
image.png