JVM 参数有很多, 其实我们直接使用默认的 JVM 参数, 不去修改都可以满足大多数情况. 但是如果你想在有限的硬件资源下, 部署的系统达到最大的运行效率, 那么进行相关的 JVM 参数设置是必不可少的. 下面我们就来对这些 JVM 参数进行详细的介绍.
JVM 参数主要分为以下三种(可以根据书写形式来区分):
1, 标准参数
标准参数, 顾名思义, 标准参数中包括功能以及输出的结果都是很稳定的, 基本上不会随着 JVM 版本的变化而变化.
我们可以通过 -help 命令来检索出所有标准参数.
关于这些命令的详细解释, 可以参考官网:
-help 也是一个标准参数, 再比如使用比较多的 -version 也是.
1,-version
显示 Java 的版本信息.
2,X 参数
对应前面讲的标准化参数, 这是非标准化参数. 表示在将来的 JVM 版本中可能会发生改变, 但是这类以 -X 开始的参数变化的比较小.
我们可以通过 Java -X 命令来检索所有 - X 参数.
关于这些参数的介绍, 其实上图的中文解释很清楚了, 这里我们不作过多的介绍.
3,XX 参数
这是我们日常开发中接触到最多的参数类型. 这也是非标准化参数, 相对来说不稳定, 随着 JVM 版本的变化可能会发生变化, 主要用于 JVM 调优和 debug.
注意: 这种参数是我们后续介绍 JVM 调优讲解最多的参数.
该参数的书写形式又分为两大类:
1,Boolean 类型
格式:-XX:[+-]<name> 表示启用或者禁用 name 属性.
例子:-XX:+UseG1GC(表示启用 G1 垃圾收集器)
2,Key-Value 类型
格式:-XX:<name>=<value> 表示 name 的属性值为 value.
例子:-XX:MaxGCPauseMillis=500(表示设置 GC 的最大停顿时间是 500ms)
4, 参数详解(持续更新)
本节我们会持续更新罗列一些 JVM 参数.
1, 打印已经被用户或者当前虚拟机设置过的参数
-XX:+PrintCommandLineFlags
比如:
2, 最大堆和最小堆内存设置
-Xms512M: 设置堆内存初始值为 512M
-Xmx1024M: 设置堆内存最大值为 1024M
这里的 ms 是 memory start 的简称, mx 是 memory max 的简称, 分别代表最小堆容量和最大堆容量. 但是别看这里是 - X 参数, 其实这是 - XX 参数, 等价于:
- -XX:InitialHeapSize
- -XX:MaxHeapSize
在通常情况下, 服务器项目在运行过程中, 堆空间会不断的收缩与扩张, 势必会造成不必要的系统压力. 所以在生产环境中, JVM 的 Xms 和 Xmx 要设置成一样的, 能够避免 GC 在调整堆大小带来的不必要的压力.
3,Dump 异常快照以及以文件形式导出
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:HeapDumpPath
堆内存出现 OOM 的概率是所有内存耗尽异常中最高的, 出错时的堆内信息对解决问题非常有帮助, 所以给 JVM 设置这个参数 (-XX:+HeapDumpOnOutOfMemoryError), 让 JVM 遇到 OOM 异常时能输出堆内信息, 并通过(-XX:+HeapDumpPath) 参数设置堆内存溢出快照输出的文件地址, 这对于特别是对相隔数月才出现的 OOM 异常尤为重要.
这两个参数通常配套使用:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./oom.dump
4, 发送 OOM 后, 执行一个脚本
-XX:OnOutOfMemoryError
比如这样设置:
-XX:OnOutOfMemoryError="C:\Program Files\Java\jdk1.8.0_152\bin\jconsole.exe"
表示发生 OOM 后, 运行 jconsole.exe 程序. 这里可以不用加 "", 因为 jconsole.exe 路径 Program Files 含有空格.
利用这个参数, 我们可以在系统 OOM 后, 自定义一个脚本, 可以用来发送邮件告警信息, 可以用来重启系统等等.
5, 打印 gc 信息
1, 打印 GC 简单信息
- -verbose:gc
- -XX:+PrintGC
一个是标准参数, 一个是 - XX 参数, 都是打印详细的 gc 信息. 通常会打印如下信息:
比如第一行, 表示 GC 回收之前有 12195K 的内存, 回收之后剩余 1088K, 总共内存为 125951K
2, 打印详细 GC 信息
- -XX:+PrintGCDetails
- -XX:+PrintGCTimeStamps
6, 指定 GC 日志以文件输出
-Xloggc:./gc.log
这个在参数用于将 gc 日志以文件的形式输出, 更方便我们去查看日志, 定位问题.
7, 设置永久代大小
-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
8, 垃圾收集器常用参数
参考文档:
来源: https://www.cnblogs.com/ysocean/p/11109018.html