
本文共 6604 字,大约阅读时间需要 22 分钟。
一:JVM选项简介
有关于JVM的控制参数,有给出6种定义,我们逐一来看下其的使用。
然后我们如果要看到这些选项的开启&设置情况,可以使用-XX:+PrintFlagsFinal
,例如我们使用-Xlog:gc* -Xmx120M -Xms120M -XX:+UseParallelGC -XX:+PrintFlagsFinal
:
二、Standard Options (标准选项)
这种是共用的参数,能被所有的JVM支持。
我们直接在命令端输入java
或java -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
搞错了,InitialSurvivorRatio
是young/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
分支,也就是会使用MinHeapFreeRatio
、MinHeapFreeRatio
这两个参数计算。
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
结尾的文件。
发表评论
最新留言
关于作者
