数据区设置
- Xms:初始堆大小
- Xmx:最大堆大小
- Xss:Java 每个线程的Stack大小
- XX:NewSize=n:设置年轻代大小
- XX:NewRatio=n:设置年轻代和年老代的比值。如:为 3,表示年轻代与年老代比值为 1:3,年轻代占整个年轻代年老代和的 1/4。
- XX:SurvivorRatio=n:年轻代中 Eden 区与两个 Survivor 区的比值。注意 Survivor区有两个。如:3,表示 Eden:Survivor=3:2,一个 Survivor 区占整个年轻代的 1/5。
- XX:MaxPermSize=n:设置持久代大小。
收集器设置
- XX:+UseSerialGC:设置串行收集器
- XX:+UseParallelGC::设置并行收集器
- XX:+UseParalledlOldGC:设置并行年老代收集器
- XX:+UseConcMarkSweepGC:设置并发收集器
- XX:+UseG1GC:G1收集器,Java9默认开启,无需设置
注:服务端jvm参数调优可移步------->:https://blog.csdn.net/Vincent2014Linux/article/details/90211192
JVM 提供的常用工具
1、jps:用来显示本地的 Java 进程,可以查看本地运行着几个 Java 程序,并显示他们的进程号。
命令格式:jps
2、jinfo:运行环境参数:Java System 属性和 JVM 命令行参数,Java class path 等信息。
命令格式:jinfo 进程 pid
3、jstat:监视虚拟机各种运行状态信息的命令行工具。
命令格式:jstat -gc 123 250 20
4、jstack:可以观察到 JVM 中当前所有线程的运行情况和线程当前状态。
命令格式:jstack 进程 pid
5、jmap:观察运行中的 JVM 物理内存的占用情况(如:产生哪些对象,及其数量)。
命令格式:jmap [option] pid
-dump:[live,]format=b,file= 使用hprof二进制形式,输出jvm的heap内容到文件, live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.
-finalizerinfo 打印正等候回收的对象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.
-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计 活的对象数量.
-permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.
使用示例:jmap -heap 27900 # 展示pid的整体堆信息如下:
[root@localhost ~]# jmap -heap 27900
Attaching to process ID 27900, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 20.45-b01
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration: #堆内存初始化配置
MinHeapFreeRatio = 40 #-XX:MinHeapFreeRatio设置JVM堆最小空闲比率
MaxHeapFreeRatio = 70 #-XX:MaxHeapFreeRatio设置JVM堆最大空闲比率
MaxHeapSize = 100663296 (96.0MB) #-XX:MaxHeapSize=设置JVM堆的最大大小
NewSize = 1048576 (1.0MB) #-XX:NewSize=设置JVM堆的'新生代'的默认大小
MaxNewSize = 4294901760 (4095.9375MB) #-XX:MaxNewSize=设置JVM堆的'新生代'的最大大小
OldSize = 4194304 (4.0MB) #-XX:OldSize=设置JVM堆的'老生代'的大小
NewRatio = 2 #-XX:NewRatio=:‘新生代’和'老生代'的大小比率
SurvivorRatio = 8 #-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
PermSize = 12582912 (12.0MB) #-XX:PermSize=<value>:设置JVM堆的'持久代'的初始大小
MaxPermSize = 67108864 (64.0MB) #-XX:MaxPermSize=<value>:设置JVM堆的'持久代'的最大大小
Heap Usage:
New Generation (Eden + 1 Survivor Space): #新生代区内存分布,包含Eden+1个Survivor区
capacity = 30212096 (28.8125MB)
used = 27103784 (25.848182678222656MB)
free = 3108312 (2.9643173217773438MB)
89.71169693092462% used
Eden Space: #Eden区内存分布
capacity = 26869760 (25.625MB)
used = 26869760 (25.625MB)
free = 0 (0.0MB)
100.0% used
From Space: #其中一个Survivor区的内存分布
capacity = 3342336 (3.1875MB)
used = 234024 (0.22318267822265625MB)
free = 3108312 (2.9643173217773438MB)
7.001809512867647% used
To Space: #另一个Survivor区的内存分布
capacity = 3342336 (3.1875MB)
used = 0 (0.0MB)
free = 3342336 (3.1875MB)
0.0% used
tenured generation: #当前的Old区内存分布
capacity = 67108864 (64.0MB)
used = 67108816 (63.99995422363281MB)
free = 48 (4.57763671875E-5MB)
99.99992847442627% used
Perm Generation: #当前的 '持久代' 内存分布
capacity = 14417920 (13.75MB)
used = 14339216 (13.674942016601562MB)
free = 78704 (0.0750579833984375MB)
99.45412375710227% used
异常排查
-
CPU 资源占用过高
1、top 查看当前 CPU 情况,找到占用 CPU 过高的进程 PID=123。
2、top -H -p123 找出两个 CPU 占用较高的线程,记录下来 PID=2345, 3456 转换为十六进制。
3、jstack -l 123 > temp.txt 打印出当前进程的线程栈。
4、查找到对应于第二步的两个线程运行栈,分析代码。 -
OOM 异常排查
1、使用 top 指令查询服务器系统状态。
2、ps -aux|grep java 找出当前 Java 进程的 PID。
3、jstat -gcutil pid interval 查看当前 GC 的状态。
4、jmap -histo:live pid 可用统计存活对象的分布情况,从高到低查看占据内存最多的对象。
5、jmap -dump:format=b,file= 文件名 [pid] 利用 Jmap dump。
6、使用性能分析工具对上一步 dump 出来的文件进行分析,工具有 MAT 等。