java内存泄露分析定位
Posted light-zhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java内存泄露分析定位相关的知识,希望对你有一定的参考价值。
线上服务模块CPU和RAM内存都出现了异常,记录一下自己的分析过程:
1.确定线上环境os是linux-debian9.3
2.确定web容器采用的是jetty9.4版本
3.先用top分析当前系统内存和cpu的占用情况
1)先top,然后m切换内存使用情况图表
top - 11:31:03 up 2 days, 14:51, 2 users, load average: 21.71, 20.58, 19.47 Tasks: 161 total, 1 running, 160 sleeping, 0 stopped, 0 zombie %Cpu(s): 25.6 us, 43.3 sy, 0.0 ni, 31.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 91.5/16305244 [|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ] KiB Swap: 0.0/16777212 [ ] PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 5295 root 20 0 9937420 878068 18684 S 128.0 5.4 52:31.03 java 5512 root 20 0 9778.5m 887436 17816 S 128.0 5.4 4505:13 java 4261 root 20 0 9994704 1.513g 18272 S 127.7 9.7 4512:04 java 3326 root 20 0 9831.6m 1.540g 18244 S 118.7 9.9 4501:25 java 3751 root 20 0 9851.2m 1.087g 18532 S 0.7 7.0 23:09.35 java 5740 root 20 0 8865332 740708 17792 S 0.3 4.5 3:08.60 java 14968 root 20 0 44948 3748 3080 R 0.3 0.0 0:00.07 top 1 root 20 0 204376 5740 4348 S 0.0 0.0 0:03.93 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.58 ksoftirqd/0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 7 root 20 0 0 0 0 S 0.0 0.0 1:19.28 rcu_sched 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root rt 0 0 0 0 S 0.0 0.0 0:00.10 migration/0 10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain 11 root rt 0 0 0 0 S 0.0 0.0 0:00.26 watchdog/0 12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0 13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1 14 root rt 0 0 0 0 S 0.0 0.0 0:00.22 watchdog/1 15 root rt 0 0 0 0 S 0.0 0.0 0:00.09 migration/1 16 root 20 0 0 0 0 S 0.0 0.0 0:00.51 ksoftirqd/1 18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H 19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/2 20 root rt 0 0 0 0 S 0.0 0.0 0:00.21 watchdog/2 21 root rt 0 0 0 0 S 0.0 0.0 0:00.08 migration/2 22 root 20 0 0 0 0 S 0.0 0.0 0:00.50 ksoftirqd/2 24 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/2:0H 25 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/3 26 root rt 0 0 0 0 S 0.0 0.0 0:00.20 watchdog/3 27 root rt 0 0 0 0 S 0.0 0.0 0:00.09 migration/3 28 root 20 0 0 0 0 S 0.0 0.0 0:00.51 ksoftirqd/3 30 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/3:0H 31 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/4 32 root rt 0 0 0 0 S 0.0 0.0 0:00.21 watchdog/4 33 root rt 0 0 0 0 S 0.0 0.0 0:00.10 migration/4 34 root 20 0 0 0 0 S 0.0 0.0 0:00.38 ksoftirqd/4 36 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/4:0H 37 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/5 38 root rt 0 0 0 0 S 0.0 0.0 0:00.20 watchdog/5 39 root rt 0 0 0 0 S 0.0 0.0 0:00.10 migration/5 40 root 20 0 0 0 0 S 0.0 0.0 0:00.35 ksoftirqd/5 42 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/5:0H 43 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/6 44 root rt 0 0 0 0 S 0.0 0.0 0:00.20 watchdog/6 45 root rt 0 0 0 0 S 0.0 0.0 0:00.10 migration/6 46 root 20 0 0 0 0 S 0.0 0.0 0:00.40 ksoftirqd/6
4.分析最占内存的web服务
1)top 然后在输入大写M自动根据内存的大小排序
2)top 然后在输入大写P自动根据CPU使用的情况排序
5.查询到进程信息后,获取到当前的进程PID
4261 root 20 0 9994704 1.513g 18272 S 127.7 9.7 4512:04 java
6.根据PID查询到WEB服务对应的端口信息,然后就知道了4261对应的web服务端口为9180
命令:
输入指令:netstat -ntlp;
tcp 0 0 0.0.0.0:9180 0.0.0.0:* LISTEN 4261/java
7.然后通过java自带的工具来导出pid对应的dump文件信息
输入指令: jmap -dump:format=b,file=/home/ifaces/9180.dump 4261
8.将文件下载到本地分析,我使用的是debian开发环境,所以直接用sftp来下载文件:
输入指令: sftp [email protected]123.xxx.150 输入密匙进入
9.将生成的dump下载到本地
sftp> get /home/ifaces/9180 /work/dump
10.然后在控制台输入 jvisualvm调用java自带的dump分析工具来分析dump的文件内容信息
输入指令:/workbench/visualvm_141/bin$ ./visualvm
11.利用jvisualvm就可以看到堆的信息了
以上是关于java内存泄露分析定位的主要内容,如果未能解决你的问题,请参考以下文章