跳至主要內容

JVM(十三)JVM 相关参数

安图新大约 5 分钟

JVM(十三)JVM 相关参数

1:标准参数

标准参数,顾名思义,标准参数中包括功能以及输出的结果都是很稳定的,基本上不会随着 JVM 版本的变化而变化

我们可以通过 -help 命令来检索出所有标准参数。

 
 

关于这些命令的详细解释,可以参考官网:https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/java.htmlopen in new window

2:-X 参数

对应前面讲的标准化参数,这是非标准化参数。表示在将来的 JVM 版本中可能会发生改变,但是这类以 -X 开始的参数变化的比较小。

我们可以通过 Java -X 命令来检索所有-X 参数。

 
 

3:-XX 参数

这是我们日常开发中接触到最多的参数类型。这也是非标准化参数,相对来说不稳定,随着 JVM 版本的变化可能会发生变化,主要用于JVM 调优和 debug。

该参数的书写形式又分为两大类:

①、Boolean 类型

格式:-XX:[+-]<name> 表示启用或者禁用 name 属性。

例子:-XX:+UseG1GC(表示启用 G1 垃圾收集器)

②、Key-Value 类型

格式:-XX:<name>=<value> 表示 name 的属性值为 value。

例子:-XX:MaxGCPauseMillis=500(表示设置 GC 的最大停顿时间是 500ms)

1)最大堆和最小堆内存设置

**  -Xms512M:设置堆内存初始值为 512M**

-Xmx1024M:设置堆内存最大值为 1024M

**  **这里的 ms 是 memory start 的简称,mx 是 memory max 的简称,分别代表最小堆容量和最大堆容量。但是别看这里是-X 参数,其实这是-XX 参数,等价于:

**  -XX:InitialHeapSize**

**  -XX:MaxHeapSize**

**  **在通常情况下,服务器项目在运行过程中,堆空间会不断的收缩与扩张,势必会造成不必要的系统压力。所以在生产环境中,**JVM 的 Xms 和 Xmx 要设置成一样的**,能够避免 GC 在调整堆大小带来的不必要的压力。

-Xmn年轻代大小 -Xmn512m注意:此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是不同的。
整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.
增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8
-XX:NewRatio年轻代与年老代的比值 -XX:NewRatio=1-XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。
-XX:SurvivorRatioEden区与Survivor区的大小比值默认8:1:1  设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
-Xss  每个线程的堆栈大小   JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右
一般小的应用, 如果栈不是很深, 应该是128k够用的 大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。
-XX:MetaspaceSize 初始元数据空间大小   
-XX:MaxMetaspaceSize=128m 

最大元数据空间大小

2)Dump 异常快照以及以文件形式导出

-XX:+HeapDumpOnOutOfMemoryError

**  -XX:HeapDumpPath**

堆内存出现 OOM 的概率是所有内存耗尽异常中最高的,出错时的堆内信息对解决问题非常有帮助,所以给 JVM 设置这个参数(-XX:+HeapDumpOnOutOfMemoryError),让 JVM 遇到 OOM 异常时能输出堆内信息,并通过(-XX:+HeapDumpPath)参数设置堆内存溢出快照输出的文件地址,这对于特别是对相隔数月才出现的 OOM 异常尤为重要。

这两个参数通常配套使用:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./

3)发生 OOM 后,执行一个脚本

**  -XX:OnOutOfMemoryError**

**  比如这样设置:**

-XX:OnOutOfMemoryError="C:\Program Files\Java\jdk1.8.0_152\bin\jconsole.exe"

表示发生 OOM 后,运行 jconsole.exe 程序。这里可以不用加“”,因为 jconsole.exe 路径 Program Files 含有空格。

利用这个参数,我们可以在系统 OOM 后,自定义一个脚本,可以用来发送邮件告警信息,可以用来重启系统等等。

4)打印 gc 信息

JVM 的 GC 日志的主要参数包括如下几个:

-XX:+PrintGC 输出 GC 日志

-XX:+PrintGCDetails 输出 GC 的详细日志

-XX:+PrintGCTimeStamps 输出 GC 的时间戳(以基准时间的形式)

-XX:+PrintGCDateStamps 输出 GC 的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)

-XX:+PrintHeapAtGC 在进行 GC 的前后打印出堆的信息

-Xloggc:../logs/gc.log 日志文件的输出路径

**   ①、打印 GC 简单信息**

**    -verbose:gc**

**    -XX:+PrintGC**

**  **一个是标准参数,一个是-XX 参数,都是打印详细的 gc 信息。通常会打印如下信息:

 
 

比如第一行,表示 GC 回收之前有 12195K 的内存,回收之后剩余 1088K,总共内存为 125951K

**   ②、打印详细 GC 信息**

**  -XX:+PrintGCDetails**

**  -XX:+PrintGCTimeStamps**

**   **

5)指定 GC 日志以文件输出

-Xloggc:./gc.log

这个在参数用于将 gc 日志以文件的形式输出,更方便我们去查看日志,定位问题

6) 垃圾收集器相关参数

 
 

详细的官网参数配置: https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html

上次编辑于:
贡献者: Andy