通常来说当我们的Java服务出现问题时,首先需要考虑的是这个进程是不是还在运行,然后再关注这个进程所占用的资源多少,CPU、内存的使用情况,从而定位到具体问题。因此,有必要对Linux服务器中的JVM异常排查进行下记录。
方法
1、查找Java进程id
ps -ef | grep java
jps
2、top查找java进程
top -c #参数c表示列出命令的详细信息
top -Hp pid #其中参数H表示使用线程分析模式,p表示指定相关的进程id为13514 打印pid进程中线程使用情况
3、printf打印线程13676的16进制数
printf "%x\n" printf
4、jinfo 输出并修改运行时的java进程的参数
5、jmap查看堆使用信息
jmap -heap 13514
6、jmap -histo 13514 #查看各个类所对应的实例对象所占用的内存:(分析内存使用飙高原因)
num:表示编号, #instances表示实例数量,#bytes表示占用的内存字节数量,class name是对应的类名
7、jmap -dump:format=b,file=file pid 打印线程dump
jmap -dump:format=b,file=mobile2020.out 13514
8、通过查看gc统计信息来分析问题,如果gc次数比较多,那么发生内存泄漏的可能性就比较大了
jstat -gcutil 13514 1000 #每隔1s统计gc信息
其中各个参数的含义如下:
s0: 新生代survivor0的使用率
s1:s1的使用率
E: 新生代eden空间的使用率
O:老年代的使用率
M:元数据的空间使用率
YGC:新生代gc次数
YGCT:新生代GC总时长
FGC:full gc的次数
FGCT: full gc 的总时长
GCT: 总的gc时长
9、 jstack 用于打印java进程的堆栈信息(比如知道java是怎么崩溃的),线程dump
jstack 13514 | grep 356c -A 100#打印java进程的堆栈信息