1.前言
1.1 排查理念
给系统定位问题的时候,知识经验是基础,应用数据是依据,工具是手段。
1.2 排查基础
在jvm中,我们常见的数据包括: 运行日志、堆栈信息、GC信息、线程栈快照(threaddump/javacode)、堆快照(heapdump/hporf)。如何获取这些数据,下面就是我们要介绍的,通过三大指令:jstat、jstack、jmap。
本文仅介绍排查思路,不详细展开介绍这四个指令,又想了解的小伙伴,可以自行百度。
2.排查思路及步骤
- (1)使用ps -ef | grep java命令找到对应java进程的pid。如果跑了多个java服务,使用top命令查看哪个java进程占用比较高。
- (2)接着根据pid,找到进程所在的用户,su 切换到用户下,这是因为如果是root用户执行一般会报socket文件获取不到的错误。
- (3)使用jstat -gc pid [interval]命令查看java进程的GC状态,观察FULL GC,如果频率很高,应该是内存泄露问题。
- (4)使用jstack -l pid >> stack-java.log,保存线程栈快照信息。
- (5)使用jmap -dump:format=b,file=heap-java.hprof pid,保存堆快照信息。
先重启服务,临时解决问题,然后根据保存的堆栈信息,通过工具进行问题分析和解决。
推荐一款功能强大的]ava堆内存分析器:MAT(Memory Analyzer Tool)工具。