1、检查有没有报错信息
日志文件中登记的错误,这个算是最简单的,在定位错误时,也最希望问题在这一步得到确认。在打印异常时,通常会打印异常的调用栈信息,通过调用栈信息就可以很便捷的定位问题了。
2、检查标准输出文件和异常输出文件有没有报错信息
Error可能不会打印在日志文件中(如果关掉了标准输出就不会打印了),但是会打印在标准输出中,前提是没有把标准输出也吃掉。通常在出现错误时,单单通过检查日志来定位问题怕是不足以说明问题,通常还会配合dump文件进行分析,因此在程序启动时需要开启相应参数(-XX:+HeapDumpOnOutOfMemoryError),在JVM出现内存溢出异常时Dump出当前的内存堆转储快照以便后续进行分析。
3、结合系统资源使用情况
如果没有报错的信息,这时候可能需要结合当前的CPU使用率等情况进行分析了。找到最为消耗资源进行针对性的分析,常用的linux命令有:
top (-H -p pid):找到占用CPU最高的线程ID
jstack:打印进程堆栈信息,看看死锁,线程啥的
jstat:监视虚拟机gc之类的功能
jmap:java内存映像工具
kill -3:吓唬jvm用的,让他生成dump文件
netstat: 查看网络连接情况用的
4、看代码
前3步的作用都是为了这一步来服务的,当然代码也需要结合一些日志来分析(总不可能一行都没有吧~)。但是不一定任何时候都能通过前三步找到代码方面的蛛丝马迹的(例如,当没有日志且没有现场时)。