【翻译】JVM虚拟机参数介绍
在这篇文章中将会介绍常用的JVM参数配置,以及每个参数的含义。
配置堆内存
每一JVM应用程序都有一个非常重要的配置,堆内存的配置,它影响这应用程序执行的性能。我们可以给程序配置一个最小的启动内存和最大占用内存的限制。就如下:
-Xms<heap size>[unit]
-Xmx<heap size>[unit]
这里的单位是内存初始化的单位支持g
,m
,k
.g
也就是GB,m
也就是MB
,k
也就是KB
。例如,我们可以设置最小启动内存为2GB,最大堆内存为5Gb,启动时候添加参数如下:
-Xms2G -Xmx5G
在Java 8 中MetaSpace
的大没有设置,如果它打包了全局配置的最大值,JVM回去自动增涨它。如果要克服这个不稳定的问题,我们需要设置:
-XX:MaxMetaspaceSize=<metaspace size>[unit]
这里MetaspaceSize表示我们配置给MetaSpace区的内存大小。在JVM设置中,内存第二个重要的地方是这是JVM年轻代gc的限制大小,默认gc的最小大小是1310MB,最大值则没有限制,设置方法如下:
-XX:NewSize=<young size>[unit]
-XX:MaxNewSize=<young size>[unit]
垃圾回收
为了有一个更加稳定的服务,选择一个合适的垃圾回收算法非常重要。JVM有许多种垃圾回收算法:
- Serial Garbage Collector
- Parallel Garbage Collector
- CMS Garbage Collector
- G1 Garbage Collector 选择哪一种实现,可以使用如下方式指定:
-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+USeParNewGC
-XX:+UseG1GC
更多关于垃圾回收的介绍请查看https://www.baeldung.com/jvm-garbage-collectors。
GC日志
为了监控应用的监控情况,我们必须检查JVM的GC情况,最简单的方式将GC日志输出为便于阅读的形式,如何配置能够打印GC日志:
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=< number of log files >
-XX:GCLogFileSize=< file size >[ unit ]
-Xloggc:/path/to/gc.log
UseGCLogFileRotation
指定了GC日志文件创建策略,就想log4j,sl4j一样。NumberOfGCLogFiles
指定的是单个JVM应用在其生命周期中最多能创建GC日志文件的数量。GCLogFileSize
指定GC日志单个文件体积最大值,loggc
指定了日子文件的路径。
要说明的是,这里还有个JVM关于GC日志的参数,他们控制日志打印的时间,分别是:XX:+PrintGCTimeStamps
和XX:+PrintGCDateStamps
。
例如:我们要定义,GC日志数量最多100个文件,单个文件的最大体积是50M,日志打印的路径是/home/user/log
,我们可以使用如下的配置:
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=50M
-Xloggc:/home/user/log/gc.log
控JVM GC是需要一个单独的线程在后台执行的,他会消耗一部分的性能,这个是你要注意的地方。
处理内存溢出问题
一个非常大的问题是:JVM应用程序都会面临着内存溢出的问题,导致程序中途crash,这样的问题非常难以复现,以至于很难去找到问题的原因。
JVM提供了一些参数,保证程序在内存溢出的时候能够将当前的堆信息保存在磁盘上,以至于你事后能更具这个快照信息找到问题根源:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./java_pid<pid>.hprof
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >"
-XX:+UseGCOverheadLimit
HeapDumpOnOutOfMemoryError
表示dump堆信息到磁盘,HeapDumpPath
是这只dump文件的文件路径和文件名,可以是任意的文件名,如果文件名中包含<pid>
,会被替换成JVM应用的pid。OnOutOfMemoryError
是在发送内存溢出的时候执行的命令,例如:我想在内存溢出的时候重启服务器。
-XX:OnOutOfMemoryError="shutdown -r"
UseGCOverheadLimit
设置GC消失时间的百分比限制,如果GC时间过长,超过了这个限制,那么就会触发内存溢出错误。
32/64设置
JVM有一种运行模式:32模式,64模式。JVM默认是使用32模式运行。如果你要设置他,可以这样设置:
-d<OS bit>