经过top命令查看CPU状况,若是CPU比较高,则经过top -Hp <pid>命令查看当前进程的各个线程运行状况,找出CPU太高的线程以后,将其线程id转换为十六进制的表现形式,而后在jstack日志中查看该线程主要在进行的工做。这里有两种状况:eclipse
若是该现场为用户线程,则经过该线程的堆栈信息查看其具体是在哪处用户代码比较消耗cpu工具
若是该线程为vm thread,则经过jstat -gcutil <pid> <period> <times>命令监控当前系统的GC情况,而后经过jmap dump:format=b,file=<filepath> <pid>导出系统当前的内存数据。导出以后将内存状况放到eclipse的mat工具中分析便可得出内存中什么对象比较消耗内存,进而能够处理相关代码。线程
top命令看到CPU并不高,而且系统内存占用率也比较低。此时能够考虑是否因为另外三种状况致使。日志
若是是接口调用比较耗时,而且不定时出现,则能够经过压测方式加大阻塞点出现的频率,从而经过jstack查看堆栈信息,找到阻塞点orm
若是某功能忽然出现停滞,状况没法复现,能够经过屡次导出jstack日志的方式比对哪些用户线程一直处于等待状态,这些线程就是可能存在问题的线程对象
若是经过jstack能够查看到死锁,则能够检查死锁的两个线程的具体阻塞点,从而处理相应问题接口