jvm相关生产问题总结

2020-02-13  本文已影响0人  sunsetJose

一 、使用jdk自带工具可以进行问题定位

先通过 ps -ef|grep java(或者使用jps命令) 找到对应的java相关进程,确定其进程id

jstat 查看堆内存各部分的使用量

命令:jstat -gc pid

S0  — Heap上的 Survivor space 0 区已使用空间的百分比 

S0C:S0当前容量的大小 

S0U:S0已经使用的大小 

S1  — Heap上的 Survivor space 1 区已使用空间的百分比 

S1C:S1当前容量的大小 

S1U:S1已经使用的大小 

E   — Heap上的 Eden space 区已使用空间的百分比 

EC:Eden space当前容量的大小 

EU:Eden space已经使用的大小 

O   — Heap上的 Old space 区已使用空间的百分比 

OC:Old space当前容量的大小 

OU:Old space已经使用的大小 

P   — Perm space 区已使用空间的百分比 

OC:Perm space当前容量的大小 

OU:Perm space已经使用的大小 

YGC — 从应用程序启动到采样时发生 Young GC 的次数 

YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒) 

FGC — 从应用程序启动到采样时发生 Full GC 的次数 

FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒) 

GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC 

命令 : jstat -gcutil pid 1000 (每隔1s打印gc情况,能够打印出百分比,gc情况更加清晰)

S0:幸存1区当前使用比例

S1:幸存2区当前使用比例

E:伊甸园区使用比例

O:老年代使用比例

M:元数据区使用比例

CCS:压缩使用比例

YGC:年轻代垃圾回收次数

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间

GCT:垃圾回收消耗总时间

重点观察老年代垃圾回收的频次和耗时

如果full gc情况比较严重,则需要查看jvm内存使用情况

jmap

命令:jmap -histo pid 展示class的内存情况

说明:instances(实例数)、bytes(大小)、classs name(类名)。它基本是按照使用使用大小逆序排列的。

命令:jmap -histo:live pid>jmap-pid.log

可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。 可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。

jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息。

命令:jmap -dump:live,format=b,file=a.log pid

说明:内存信息dump到a.log文件中。这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用。

查看对象数最多的对象,并按降序排序输出:

执行:jmap -histo <pid>|grep alibaba|sort -k 2 -g -r|less

查看占用内存最多的最象,并按降序排序输出:

执行:jmap -histo <pid>|grep alibaba|sort -k 3 -g -r|less

在cpu使用率较高的情况下,可能需要查看线程使用情况

jstack -l pid  查看对应进程号的线程使用情况

-l 输出锁的附加信息

jstack pid >> jstack.log  导出成文件

需要多次采集观察线程状态

死锁,Deadlock(重点关注) 

等待资源,Waiting on condition(重点关注) 

•  等待获取监视器,Waiting on monitor entry(重点关注) 

阻塞,Blocked(重点关注) 

•  执行中,Runnable 

•  暂停,Suspended 

•  对象等待中,Object.wait() 或 TIMED_WAITING 

•  停止,Parked 

二、使用阿里arthas工具进行更加准确的问题分析

可直接使用java -jar arthas-boot.jar的方式进行启动

启动完成后可以选择对应的java 进程进行排查问题

命令简单介绍

dashboard 当前系统的实时数据面板

thread 查看当前 JVM 的线程堆栈信息

watch 方法执行数据观测

trace 方法内部调用路径,并输出方法路径上的每个节点上耗时

stack 输出当前方法被调用的调用路径

tt 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测

monitor 方法执行监控

jvm 查看当前 JVM 信息

vmoption 查看,更新 JVM 诊断相关的参数

sc 查看 JVM 已加载的类信息

sm 查看已加载类的方法信息

jad 反编译指定已加载类的源码

classloader 查看 classloader 的继承树,urls,类加载信息

heapdump 类似 jmap 命令的 heap dump 功能

注意:需要使用 shutdown命令 退出 Arthas。 (自动重置所有增强过的类)

使用 dashboard 命令可以概览程序的 线程、内存、GC、运行环境信息

thread -n [显示的线程个数],就可以排列出 CPU 使用率 Top N 的线程

使用 thread | grep pool 命令查看线程池里线程信息

thread -b 命令查看直接定位到死锁信息

如果怀疑不是自己的代码,可以使用 jad 命令直接反编译 class

使用  sc -d -f  ** 命令查看类的字段信息

上一篇下一篇

猜你喜欢

热点阅读