内存泄漏排查流程

1、使用top -c 查看 CPU 占用高的进程:

 

,从 top 命令的结果看,19272 号进程 CPU 占用率最高,基本确定问题是该进程引起,可以从 Command 栏看到这正是算法模块程序,注意图是线下4C机器上复现时的截图。

 

2、使用ps -mp pid -o THREAD,tid,time命令定位问题线程。

ps -mp 19272 -o THREAD,tid,time
USER %CPU PRI SCNT WCHAN USER SYSTEM TID TIME
USER 191 - - - - - - 00:36:54
USER 0.0 19 - futex_ - - 19272 00:00:00
USER 68.8 19 - futex_ - - 19273 00:13:18
USER 30.2 19 - - - - 19274 00:05:50
USER 30.2 19 - - - - 19275 00:05:50
USER 30.2 19 - - - - 19276 00:05:50
USER 30.1 19 - - - - 19277 00:05:49
USER 0.4 19 - futex_ - - 19278 00:00:05
USER 0.0 19 - futex_ - - 19279 00:00:00
USER 0.0 19 - futex_ - - 19280 00:00:00
USER 0.0 19 - futex_ - - 19281 00:00:00
USER 0.4 19 - futex_ - - 19282 00:00:04
USER 0.3 19 - futex_ - - 19283 00:00:03
USER 0.0 19 - futex_ - - 19284 00:00:00
USER 0.0 19 - futex_ - - 19285 00:00:00
USER 0.0 19 - futex_ - - 19286 00:00:00
USER 0.0 19 - skb_wa - - 19362 00:00:00

从结果可以看到,出现问题的线程主要是 19273-19277。

 

1、我们可以使用 jstat 命令查看 GC 统计:

使用 jstat -gc pid [interval] 命令查看了 java 进程的 GC 状态,果然,FULL GC 达到了每秒一次。

$ jstat -gcutil 19272 2000 10
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 22.71 100.00 97.16 91.53 2122 19.406 282 809.282 828.688
0.00 0.00 100.00 100.00 97.16 91.53 2122 19.406 283 809.282 828.688
0.00 0.00 92.46 100.00 97.16 91.53 2122 19.406 283 812.730 832.135
0.00 0.00 100.00 100.00 97.16 91.53 2122 19.406 284 812.730 832.135
0.00 0.00 100.00 100.00 97.16 91.53 2122 19.406 285 815.965 835.371
0.00 0.00 100.00 100.00 97.16 91.53 2122 19.406 285 815.965 835.371
0.00 0.00 100.00 100.00 97.16 91.53 2122 19.406 286 819.492 838.898
0.00 0.00 100.00 100.00 97.16 91.53 2122 19.406 286 819.492 838.898
0.00 0.00 100.00 100.00 97.16 91.53 2122 19.406 287 822.751 842.157
0.00 0.00 30.78 100.00 97.16 91.53 2122 19.406 287 825.835 845.240

重点关注一下几列:
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
可以看到,20s 的时间中进行了 5 次 full GC,仅仅耗费在 GC 的时间已经到了 17s。

jstat

jstat 是一个非常强大的 JVM 监控工具,一般用法是: jstat [-options] pid interval

它支持的查看项有:

  • -class 查看类加载信息
  • -compile 编译统计信息
  • -gc 垃圾回收信息
  • -gcXXX 各区域 GC 的详细信息 如 -gcold

使用它,对定位 JVM 的内存问题很有帮助。

 

2、

jmap -histo:live [pid] >f 打印堆内存存活对象信息

jmap -histo 2310 | head -20 直接查看内存中的对象,前20行




3、free 查看内存
[root@VM_16_17_centos bin]# free 
              total        used        free      shared  buff/cache   available
Mem:        1882892      785272      280428       40496      817192      852060
Swap:  

 

 

posted on 2020-10-25 16:16  潮流教父孙笑川  阅读(43)  评论(0)    收藏  举报

导航