JVM篇-常用控制参数使用分析
发布日期:2021-05-07 20:42:21 浏览次数:46 分类:精选文章

本文共 6604 字,大约阅读时间需要 22 分钟。

一:JVM选项简介

有关于JVM的控制参数,有给出6种定义,我们逐一来看下其的使用。

在这里插入图片描述

​ 然后我们如果要看到这些选项的开启&设置情况,可以使用-XX:+PrintFlagsFinal,例如我们使用-Xlog:gc* -Xmx120M -Xms120M -XX:+UseParallelGC -XX:+PrintFlagsFinal:

在这里插入图片描述

二、Standard Options (标准选项)

​ 这种是共用的参数,能被所有的JVM支持。

​ 我们直接在命令端输入javajava -help就能展示这一类的参数

在这里插入图片描述

​ 这种下面还有其他参数,这种类型我们较长使用的就是-version参数,例如java -version展示java版本,以及查看java 的启动模式,是不是服务器模式:

在这里插入图片描述

​ 这里可以看到目前版本是9,以-server运行,然后是mixed mode混合模式编译。

三、Non-Standard Options (非标准选项)

​ 这些选项是Hotspot JVM (Hotspot虚拟机)的通用选项

1、-X

​ 我们使用java -X能展示这种类型的所有参数,java -X

在这里插入图片描述

2、-Xinternalversion

​ 展示比-sersion更详细的内容,可以看到,这里将这个JVMbuild构建的时间也有展示。

在这里插入图片描述

3、-Xloggc

​ 这个是将GC的内容写到找到的文件,例如使用VM option-Xlog:gc* -XX:+UseSerialGC -Xmx128M -Xms128M -Xmn30M -Xloggc:E:\gc.log。但整个需要注意,其只是展示最终的收集结构,并不会存储收集时的具体行为过程:

[0.036s][info][gc] Using Serial[0.571s][info][gc] GC(0) Pause Young (Allocation Failure) 24M->18M(125M) 28.368ms[1.009s][info][gc] GC(1) Pause Young (Allocation Failure) 42M->39M(125M) 33.248ms[1.162s][info][gc] GC(2) Pause Young (Allocation Failure) 63M->59M(125M) 31.377ms[1.298s][info][gc] GC(3) Pause Young (Allocation Failure) 83M->68M(125M) 15.121ms[1.451s][info][gc] GC(4) Pause Young (Allocation Failure) 92M->88M(125M) 33.268ms[1.736s][info][gc] GC(6) Pause Full (Allocation Failure) 112M->53M(125M) 103.416ms[1.736s][info][gc] GC(5) Pause Young (Allocation Failure) 112M->53M(125M) 103.554ms[1.896s][info][gc] GC(7) Pause Young (Allocation Failure) 77M->60M(125M) 7.197ms[2.342s][info][gc] GC(8) Pause Young (Allocation Failure) 84M->81M(125M) 23.767ms[2.927s][info][gc] GC(10) Pause Full (Allocation Failure) 105M->48M(125M) 90.601ms[2.927s][info][gc] GC(9) Pause Young (Allocation Failure) 105M->48M(125M) 90.699ms

4、-Xmn

​ 初始化时设置堆年轻代的最大内存。同时其可以使用另一组参数-XX:NewSize&-XX:MaxNewSize设置年轻代堆的最小,最大值。

​ 先使用-Xlog:gc* -XX:+UseSerialGC -Xmx128M -Xms128M -Xmn30M,然后使用VisualVM查看:

在这里插入图片描述

​ 可以看到目前年轻代是30M,同时年轻代的eden : survivor 0 : survivor 1其比例是8 : 1 : 1

​ 我们再使用-Xlog:gc* -XX:+UseSerialGC -Xmx128M -Xms128M -Xmn30M -XX:NewSize=40M参数看下。

在这里插入图片描述

​ 可以看到,当我们在-Xmn-XX:NewSize一起使用的时候,其作用的是-XX:NewSize

5、-Xms & -Xmx

​ 这两个是一起的,分别对应的是设置整个堆的最大,最小值。我们使用参数选项-Xlog:gc* -XX:+UseSerialGC -Xmx256M -Xms128M -Xmn30M

在这里插入图片描述

​ 可以很清楚的看到,整个年轻代&老年代总共是256M。

6、-XshowSettings:vm

​ 这个是展示与VM相关的初始设置-Xlog:gc* -XX:+UseSerialGC -Xmx256M -Xms128M -Xmn30M -XshowSettings:vm

​ 然后控制台输出:

在这里插入图片描述

7、-Xss

​ 设置线程栈的大小,等同于参数-XX:ThreadStackSizw

四、Advanced Runtime Options

​ 这个类型是那些用于JVM运行控制行为的参数。

1、-XX:ThreadStackSize

​ 这个在前面有提过,设置线程栈的大小。

2、-XX:+TraceClassLoading

​ 跟踪类的加载,例如使用-Xlog:gc* -XX:+UseSerialGC -Xmx256M -Xms128M -XX:+TraceClassLoading,其会跟踪类的加载,这个应该能用来判断类有没有被加载:

[0.252s][info   ][class,load   ] java.io.FileInputStream$1 source: jrt:/java.base[0.252s][info   ][class,load   ] java.net.SocksConsts source: jrt:/java.base[0.252s][info   ][class,load   ] com.fev.jvm.MyJvm source: file:/D:/Pra.........

3、-XX:+TraceClassUnloading

​ 这个是看类的卸载。

4、-XX:+UseCompressedOops

​ 使用压缩指针,默认情况下,当堆为32GB以下,则使用压缩指针,对对象引用将表示为32偏移量。超过也可以主动设置为压缩指针。

5、-XX:OnOutOfMemoryError

​ 这个是指在发送OOM的时候,执行这个选项后面的一系列自定义命令,用;隔开,例如你可以写一个脚本放这后面,用于服务重启。

五、Advanced Serviceability Options

​ 这种类型是提供一些系统运行、debug等的一些选项参数。

1、-XX:+HeapDumpOnOutOfMemoryError

​ 在发生java.lang.OutOfMemoryError时,默认生成对的转储信息,一般配合下面选项,指定具体的位置

2、-XX:HeapDumpPath

​ 对于堆相关信息的转储文件。例如-Xlog:gc* -XX:+UseSerialGC -Xmx256M -Xms128M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:/dump1.hprof

六、Advanced Garbage Collection Options

​ 一些控制垃圾收集器行为的选项

1、一些公共使用

1)、-XX:ConcGCThreads

​ 并发的GC线程数量(要小于ParallelGCThreads的数量)

2)、-XX:ParallelGCThreads

​ 并行的GC线程数量

3)、-XX:InitialHeapSize &XX:MaxHeapSize

​ 初始化堆大小,一个应该就类似的-Xms,然后XX:MaxHeapSize是最大的堆大小

4)、-XX:InitialSurvivorRatio

​ young/ survivor 的比例大小,默认的是8/1,同时看还有一个最小比例。但我们需要注意,这个参数应该是Parallel(-XX:+UseParallelGC/-XX:+UseParallelOldGC)垃圾收集器的,同时不能开启其的自适应策略(-XX:-UseAdaptiveSizePolicy)

product(uintx, InitialSurvivorRatio, 8,                                   \        "Initial ratio of young generation/survivor space size")          \        range(0, max_uintx)
product(uintx, MinSurvivorRatio, 3,                                       \        "Minimum ratio of young generation/survivor space size")          \        range(3, max_uintx)

下面我们用参数选项-Xlog:gc* -Xmx128M -Xms128M -Xmn32M -XX:+UseParallelGC -XX:-UseAdaptiveSizePolicy:

在这里插入图片描述

​ 然后我们调整下,增加参数-XX:InitialSurvivorRatio=4

在这里插入图片描述

5)、-XX:MaxGCPauseMillis

​ 最大的暂停时间,不过这个JVM不是一定要满足,单位是毫秒

6)、-XX:MaxMetaspaceSize

​ 这个选项就是设置元空间的大小,这个元空间大小在JDK8及之后是直接与机器内存关联的,但我们最好还是限制下,以防内存泄露影响其他的应用。

7)、-XX:MaxNewSize

​ 设置年轻代的最大内存

8)、-XX:NewRatio

​ 这个是设置老年代与年轻代的比例,默认为2

product(uintx, NewRatio, 2,                                               \        "Ratio of old/new generation sizes")                              \        range(0, max_uintx-1)

​ 我们使用参数-Xlog:gc* -Xmx120M -Xms120M -XX:+UseParallelGC -XX:-UseAdaptiveSizePolicy

在这里插入图片描述

​ 我们调整下,使用-XX:NewRatio=3

在这里插入图片描述

9)、-XX:NewSize

​ 设置年轻代的大小,等同于前面的-Xmn。官方推荐是在总的堆区的1/2 - 1/4。

10)、-XX:ParallelGCThreads

​ 设置并行线程数,与CPU的数量有关。

11)、-XX:+PrintGC & -XX:+PrintGCDetails

​ 这两个就是打印GC日志一个是简单日志,一个是详细日志,已经比较熟了。但其在JDK9&之后已经用-Xlog:gc-Xlog:gc*替代了。

12)、-XX:SurvivorRatio

​ 这个是设置eden/survivor的比例,需要注意,别跟InitialSurvivorRatio搞错了,InitialSurvivorRatioyoung/survivor

13)、-XX:TLABSize

​ 这个就是设置TLAB的缓存大小,用于控制栈上分配。

14)、-XX:UseConcMarkSweepGC

​ 使用CMS垃圾收集器

15)、-XX:+UseG1GC

​ 使用G1垃圾收集器

16)、-XX:+UseParallelOldGC

​ 使用ParallelOld垃圾回收器

17)、-XX:+UseParNewGC

​ 使用ParNew垃圾回收器

18)、-XX:UseSerialGC

​ 使用Serial垃圾回收器

19)、-XX:+UseTLAB

​ 是否使用栈上分配

2、CMS

1)、-XX:CMSInitiatingOccupancyFraction

​ 该值表示,达到这个阈值就进行GC。

2)、-XX:CMSTriggerRatio

​ 这个值是用来算前面-XX:CMSInitiatingOccupancyFraction的比例的。

_cmsGen ->init_initiating_occupancy(CMSInitiatingOccupancyFraction, CMSTriggerRatio);
void ConcurrentMarkSweepGeneration::init_initiating_occupancy(intx io, uintx tr) {  assert(io <= 100 && tr <= 100, "Check the arguments");  if (io >= 0) {    _initiating_occupancy = (double)io / 100.0;  } else {    _initiating_occupancy = ((100 - MinHeapFreeRatio) +                             (double)(tr * MinHeapFreeRatio) / 100.0)                            / 100.0;  }}
product(intx, CMSInitiatingOccupancyFraction, -1,                         \        "Percentage CMS generation occupancy to start a CMS collection "  \        "cycle. A negative value means that CMSTriggerRatio is used")     \        range(min_intx, 100)

​ 可以看到,CMSInitiatingOccupancyFraction默认是-1,所以默认是走的else分支,也就是会使用MinHeapFreeRatioMinHeapFreeRatio这两个参数计算。

3、G1

1)、XX:G1HeapRegionSize

​ 这个是被G1垃圾回收器使用,用来设置每块Region的大小

product(size_t, G1HeapRegionSize, 0,                                      \        "Size of the G1 regions.")                                        \        range(0, 32*M)                                                    \        constraint(G1HeapRegionSizeConstraintFunc,AfterMemoryInit)

​ 可以看到其最大为32M。

2)、-XX:G1ReservePercent

​ 这个表示最少预留多少堆空间用于给对象晋升使用,防止晋升失败

​ 要了解整个详细的这些参数,可以去源码查看以globals.hpp结尾的文件。

上一篇:Redis篇-Redis配置文件与RDB&AOF基本使用
下一篇:JVM篇-垃圾收集的相关概念&具体算法使用

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年03月26日 21时58分32秒