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