【翻译】JVM虚拟机参数介绍

在这篇文章中将会介绍常用的JVM参数配置,以及每个参数的含义。

配置堆内存

每一JVM应用程序都有一个非常重要的配置,堆内存的配置,它影响这应用程序执行的性能。我们可以给程序配置一个最小的启动内存和最大占用内存的限制。就如下:

1
2
-Xms<heap size>[unit] 
-Xmx<heap size>[unit]

这里的单位是内存初始化的单位支持g,m,k.g也就是GB,m也就是MB,k也就是KB。例如,我们可以设置最小启动内存为2GB,最大堆内存为5Gb,启动时候添加参数如下:

1
-Xms2G -Xmx5G

在Java 8 中MetaSpace的大没有设置,如果它打包了全局配置的最大值,JVM回去自动增涨它。如果要克服这个不稳定的问题,我们需要设置:

1
-XX:MaxMetaspaceSize=<metaspace size>[unit]

这里MetaspaceSize表示我们配置给MetaSpace区的内存大小。在JVM设置中,内存第二个重要的地方是这是JVM年轻代gc的限制大小,默认gc的最小大小是1310MB,最大值则没有限制,设置方法如下:

1
2
-XX:NewSize=<young size>[unit] 
-XX:MaxNewSize=<young size>[unit]

垃圾回收

为了有一个更加稳定的服务,选择一个合适的垃圾回收算法非常重要。JVM有许多种垃圾回收算法:

  • Serial Garbage Collector
  • Parallel Garbage Collector
  • CMS Garbage Collector
  • G1 Garbage Collector
    选择哪一种实现,可以使用如下方式指定:
    1
    2
    3
    4
    -XX:+UseSerialGC
    -XX:+UseParallelGC
    -XX:+USeParNewGC
    -XX:+UseG1GC

更多关于垃圾回收的介绍请查看https://www.baeldung.com/jvm-garbage-collectors

GC日志

为了监控应用的监控情况,我们必须检查JVM的GC情况,最简单的方式将GC日志输出为便于阅读的形式,如何配置能够打印GC日志:

1
2
3
4
-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:+PrintGCTimeStampsXX:+PrintGCDateStamps

例如:我们要定义,GC日志数量最多100个文件,单个文件的最大体积是50M,日志打印的路径是/home/user/log,我们可以使用如下的配置:

1
2
3
4
-XX:+UseGCLogFileRotation  
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=50M
-Xloggc:/home/user/log/gc.log

控JVM GC是需要一个单独的线程在后台执行的,他会消耗一部分的性能,这个是你要注意的地方。

处理内存溢出问题

一个非常大的问题是:JVM应用程序都会面临着内存溢出的问题,导致程序中途crash,这样的问题非常难以复现,以至于很难去找到问题的原因。

JVM提供了一些参数,保证程序在内存溢出的时候能够将当前的堆信息保存在磁盘上,以至于你事后能更具这个快照信息找到问题根源:

1
2
3
4
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=./java_pid<pid>.hprof
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >"
-XX:+UseGCOverheadLimit

HeapDumpOnOutOfMemoryError表示dump堆信息到磁盘,HeapDumpPath是这只dump文件的文件路径和文件名,可以是任意的文件名,如果文件名中包含<pid>,会被替换成JVM应用的pid。OnOutOfMemoryError是在发送内存溢出的时候执行的命令,例如:我想在内存溢出的时候重启服务器。

1
-XX:OnOutOfMemoryError="shutdown -r"

UseGCOverheadLimit设置GC消失时间的百分比限制,如果GC时间过长,超过了这个限制,那么就会触发内存溢出错误。

32/64设置

JVM有一种运行模式:32模式,64模式。JVM默认是使用32模式运行。如果你要设置他,可以这样设置:

1
-d<OS bit>

原文地址: https://www.baeldung.com/jvm-parameters