背景介绍
- 日常在开发时需要设置相关虚拟机参数,这里专门对经常用到的虚拟机参数做一整理汇总,方便以后使用的时候查看。
相关参数
堆内存溢出(堆溢出时保存快照)
-
-XX:+HeapDumpOnOutOfMemoryError
该配置会把快照保存在user.dir
中,比如你用tomcat启动,那应该是在tomcat
的bin
目录下
当然,也可以通过XX:HeapDumpPath=./java_pid.hprof
来显示指定路径
此外,OnOutOfMemoryError
参数允许用户指定当出现oom时,指定某个脚本来完成一些动作,比如发送消息等。
$java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:OnOutOfMemoryError ="sh ~/cleanup.sh" MyApp
-
说明:
通过jvm参数-XX:+HeapDumpOnOutOfMemoryError
可以让JVM在出现内存溢出时候Dump出当前的内存转储快照。快照格式为java_pid2821.hprof
(2821为Java进程号) -
参数设置:
-XX:+HeapDumpOnOutOfMemoryError
:当内存溢出时触发java.lang.OutOfMemo: Java heap space
-XX:HeapDumpPath=/opt/heap
·: 内存溢出时,保存内存快照文件- 例子:
nohup java -jar -server -Xms8g -Xmx8g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/heap.hprof ./test.jar >/dev/null 2>&1 &
OOM排查
- 1、先查看应用进程号pid:
ps -ef | grep 应用名
- 2、查看pid垃圾回收情况:
jstat -gc pid 5000
(时间间隔,毫秒),即会每5秒一次显示进程号为68842的java进成的GC情况,显示内容: - 3、开启OOM快照:
-XX:+HeapDumpOnOutOfMemoryError
(开启堆快照)-XX:HeapDumpPath=C:/m.hprof
(保存文件到哪个目录)
- 4、
dump
查看方法栈信息:jstack -l pid > /home/test/jstack.txt
- 5、dump 查看JVM内存分配以及使用情况
jmap -heap pid > /home/test/jmapHeap.txt
- 6、dump jvm二进制的内存详细使用情况 (效果同在Tomcat的catalina.sh中添加
set JAVA_OPTS=%JAVA_OPTS% -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/test//oom.hprof
此文件需要借用内存分析工具如:Memory Analyzer (MAT)
来分析)jmap -dump:format=b,file=/home/test/oom.hprof pid
JVM内存设置
-
参考1有如下描述
-
设置JVM内存的参数有四个:
-Xmx
Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;-Xms
Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;-Xmn
Java Heap Young区大小,不熟悉最好保留默认值;-Xss
每个线程的Stack大小,不熟悉最好保留默认值;
-
参考2有如下描述:
-Xms512m
设置JVM促使内存为512m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。-Xmx512m
,设置JVM最大可用内存为512M。-Xmn200m
:设置年轻代大小为200M。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。-Xss128k
:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
-
启动命令示例
-
启动命令示例,这样启动150m左右差不多够了:
nohup java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=56m -Xms128m -Xmx128m -Xmn32m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC short-url.jar --spring.profiles.active=prod >/dev/null 2>&1&
- 以上命令中的参数意义:
-XX:MetaspaceSize=128m
:元空间默认大小-XX:MaxMetaspaceSize=128m
:元空间最大大小-Xms1024m
:堆最大大小-Xmx1024m
:堆默认大小-Xmn256m
:新生代大小-Xss256k
:栈最大深度大小-XX:SurvivorRatio=8
:新生代分区比例 8:2-XX:+UseConcMarkSweepGC
:指定使用的垃圾收集器,这里使用CMS收集器-XX:+PrintGCDetails
:打印详细的GC日志
JDK虚拟机参数
-XX:+<option>
// 开启option参数;
-XX:-<option>
// 关闭option参数;
-XX:<option>=<value>
// 将option参数的值设置为value。
-Xms
指定启动时内存大小(此值可以设置成与-Xmx相同,以避免每次GC完成后 JVM 内存重新分配)。
-Xmx
指程序运行时最大可用内存大小,程序运行中内存大于这个值会 OutOfMemory。
-Xmn
年轻代大小(整个JVM内存大小 = 年轻代 + 年老代 + 永久代)。
-Xss
设置每个线程的堆栈大小
java虚拟机对非堆区内存配置的两个参数:
1、-XX:PermSize
:表示非堆区初始内存分配大小(方法区)
2、-XX:MaxPermSize
:表示对非堆区分配的内存的最大上限(方法区)。
JDK 官方文档对 -X、-XX
的说明
- 1、JDK 7 及以前版本官方文档对
-X、-XX
的说明如下:
Options that begin with -X are non-standard (not guaranteed to be supported on all VM implementations), and are subject to change without notice in subsequent releases of the JDK.
以 -X
开头的选项是非标准选项(不能保证被所有的 JVM 实现都支持),并且在 JDK 的后续版本中不需要通知就可以进行更改。
Options that are specified with -XX are not stable and are subject to change without notice.
以 -XX
指定的选项是不稳定的,并且会在没有通知的情况下进行更改。
- 2、JDK 8 版本
相对于非标准选项,标准选项保证得到所有 Java 虚拟机(JVM)的实现支持[1]。它们用于常见的操作,如检查 JRE 版本(-version)、设置类路径(-classpath)、启用详细输出(-verbose)、-javaagent、-javaagent等等,这些标准参数可以通过java -help 查看。
-X
:非标准选项
Non-standard options are general purpose options that are specific to the Java HotSpot Virtual Machine, so they are not guaranteed to be supported by all JVM implementations, and are subject to change. These options start with -X.
以 -X
开头的这些选项是非标准选项,是特定于 Java HotSpot 虚拟机的通用选项,不保证所有 JVM 的实现都支持它们,而且还会发生变化。
-XX
:高级选项
Advanced options are not recommended for casual use. These are developer options used for tuning specific areas of the Java HotSpot Virtual Machine operation that often have specific system requirements and may require privileged access to system configuration parameters. They are also not guaranteed to be supported by all JVM implementations, and are subject to change. Advanced options start with -XX.
以 -XX
开头的选项是高级选项,高级选项不建议随意使用。这些是开发人员用于调优 Java HotSpot 虚拟机操作的特定区域的选项,这些选项通常具有特定的系统需求,并且可能需要特权访问系统配置参数。它们也不保证得到所有 JVM 的实现的支持,并且可能会发生变化。