JVM-05-JVM参数

JVM-05-JVM参数

前序

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

​ JVM参数有很多,其实我们直接使用默认的JVM参数,不去修改都可以满足大多数情况。

​ 但如果在有限的硬件资源下,部署的系统达到最大的运行效率,那么进行相关的JVM参数设置是必不可少的。

​ 下面我们就来对这些JVM参数进行详细的介绍。

​ JVM参数主要分为以下几种(可以根据书写形式来区分):

1. 标准参数

mark

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

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

  • 关于命令的详细解释,参考官网:https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/java.html

  • -help 也是一个标准参数,再比如使用比较多的 -version也是。

mark

2. X 参数

mark

关于这些参数的介绍,其实上图的中文解释很清楚了,这里我们不作过多的介绍。

3. XX 参数

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

注意:这种参数使我们后续介绍JVM调优讲解最多的参数。

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

  1. Boolean类型

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

例子:-xx:+UserG1GC 表示启用G1垃圾收集器

  1. key-value类型

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

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

4. 参数详解

  1. 打印已被用户设置过或者当前虚拟机设置过的参数

mark

  1. 设置堆的大小
  • -Xms512M : 设置堆的初始大小是512M
  • -Xmx1024M:设置堆内存最大值为1024M

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

  • -XX:InitialHeapSize
  • -XX:MaxHeapSize

在通常情况下,服务器项目在运行过程中,堆空间会不断的收缩与扩张,势必会造成不必要的系统压力。

所以在生产环境中,JVM的Xms和Xmx一定要设置成一样的!!!!能够避免GC在调整整堆大小带来的不必要的压力。

  1. Dump异常快照以及文件形式导出

-XX:+HeapDumpOutOfMemoryError

-XX:HeapDumpPath

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

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

1
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
  1. 发送OOM之后,执行一个脚本

-XX:OnOutOfMemoryError

  • 比如设置成这样:
1
-XX:OnOutOfMemoryError="C:\Program Files\Java\jdk1.8.0_152\bin\jconsole.exe"
  • 表示发生OOM后,运行jconsole.exe程序。(这里可以不用加“”,因为jconsole.exe路径Program Files含有空格。)
  • 利用这个参数,我们可以在系统OOM后,自定义一个脚本,可以用来发送邮件告警信息,可以用来重启系统等等。
  1. 打印GC信息
  • 用来打印GC简单信息
1
2
3
4
5
-verbose:gc
-XX:+PrintGC
# 第一个是标准参数
# 第二个是-XX参数
# 都是打印GC的信息

mark

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

  • 用来打印GC详细信息
1
2
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps

mark

  1. 指定GC日志以文件形式输出
1
-Xloggc:./gc.log

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

  1. 设置永久代大小
1
-XX:MaxPermSize=1280m
  • 在之前JDK1.7以及以前的版本中,只有Hotspot 才有Perm区域,称为永久代,它在启动时固定大小,很难进行调优
  • 在某些情况下,如果动态加载类过多,容易产生Perm区的OOM。(比如某个实际的Web工程中,因为功能点较多,在运行过程中,要不断动态加载很多类,就会产生类似的错误)"Exception in thread 'dubbo client x.x.connect' java.lang.OutOfMemoryError:PermGenspace"
  • 为了解决这个问题,就需要在项目启动的时候,设置运行参数-XX:MaxPermSize
  • 注意:在JDK1.8以后面的版本,使用元空间来代替永久代。在 JDK1.8以及后面的版本中,如果设定参数-XX:MaxPermSize,启动JVM不会报错,但是会提示:
    • Java Hotspot 64Bit Server VM warning:ignoring option MaxPermSize=1280m:support was removed in 8.0
  1. 垃圾回收的常用参数

mark

mark

5. 参考文档

[官方详细:可以当做手册]https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html

[官方注解]https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/java.html

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信