jps -l 查询出运行的jvm进程列表,可以查看pid
线程堆栈排查
jstack pid > jstack.log 将堆栈打印入文件中查看
1 查看有没有waiting for monitor entry,State:BLOCKED 阻塞的线程,看看什么原因导致。比如如果sql死锁也会导致线程一直阻塞
2 正常的线程池/logback等框架线程的空闲线程状态是WAITING/TIME_WAITING,操作是object.wait、object.wait(timeout)、unsafe.park
3 非框架的object.wait操作要关注下,看会不会导致一直阻塞等待
4 对于runable状态的线程,注意socketRead0这类IO操作,可能socket一直等待。
5 搜索waiting to lock monitor,看看有没有死锁。
参考:
https://www.cnblogs.com/kongzhongqijing/articles/3630264.html
对dump调优
jmap -heap pid 查看程序堆内存使用情况。重点看看老年代和持久带的情况。
查看大对象
jmap -histo |less
jmap -histo |grep 模块名|sort -k 3 -g -r|less
查找出大对象后,在根据对象类去反查代码,这种一般是代码有问题导致内存泄漏
jstat 监控
jstat -gc pid 毫秒 次数 查看gc情况。以天为单位查看
关注点:
1 YGC(年轻代GC次数) YGCT(年轻代GC时间) FGC(full gc次数) FGCT(full gc时间)
2 一般比较关注PERM区的情况,查看GC的增长情况。
jstat -gccause pid 毫秒 次数 关注上一次执行原因
如果GC次数太多,想要查看更详细的原因可以查看GC日志,系统默认是不打印的。
通过-XX:+PrintGCDetails -Xloggc:filename 设置GC打印