-
排除应用之外的影响因素:
top
(cpu)、free
(内存)、df
(磁盘)、dstat
(网络流量)、pstack
、vmstat
、st1race
(底层系统调用) -
top
定位CPU 最高的进程 -
top -Hp pid
定位使用 CPU 最高的线程(或者ps -mp pid -o THREAD,tid,time
) -
printf '0x%x' tid
线程 id 转化 16 进制 -
jstack pid | grep tid
找到线程堆栈5.1 gc线程(如下是查看gc情况的几种方式)
👉🏿 查看gc 日志
👉🏿
jstat -gcutil 进程号 统计间隔毫秒 统计次数(缺省代表一次统计)
👉🏿 如果所在公司有对应用进行监控的组件当然更方便(比如Prometheus + Grafana)
结合内存
dump日志
分析:-
哪些对象导致的内存溢出导致频繁gc(尤其是full gc)
-
如果不是内存溢出导致频繁gc,也可能是代码或者第三方依赖的包中有显示的System.gc()调用,此时可以通过添加
-XX:+DisableExplicitGC
来禁用JVM对显示GC的响应。在分配堆外内存的时候,内存不足时会显示的调用System.gc(),如果显示gc被禁用,则可能会导致堆外内存溢出,所以堆外内存的回收最好就不要依赖jvm,主动回收吧。
5.2 业务线程
👉🏿 关注线程堆栈的
lock
字段👉🏿
jstack -l pid | grep BLOCKED
查看阻塞态线程堆栈 -
评论