内存泄漏排查
一、查看CPU实时运行情况
top

第一部分
| 第一行 | 参数 | 含义 | 备注 |
| top时间 | 系统当前时间 | ||
| up 时间 | 系统运行时间 | 开机时间 | |
| 数字users | 用户登录人数 | ||
| load average: | 系统平均负载 | 负载越高越使用率越高 | |
| 第二行 | Tasks: 137 total | 总进程数 | |
| 1 running | 1个进程在运行 | ||
| 136 sleeping | 休眠线程数 | ||
| 0 stopped | 停止线程数 | ||
| 0 zombie | 僵尸线程数 | ||
| 第三行 | 0.0 us | 用户空间占用CPU百分比 | user mode |
| 0.1 sy | 内核空间占用CPU百分比 | system mode | |
| 0.0 ni | 用户进程空间内改变过优先级的进程占用CPU百分比 | low priority user mode (nice) | |
| 99.9 id | 闲CPU百分比 | idle task | |
| 0.0 wa | 等待IO的CPU时间百分比 | I/O waiting | |
| 0.0 hi | 硬件中断时间百分比 | servicing IRQs | |
| 0.0 si | 软件中断 时间百分比 | servicing soft IRQs | |
| 0.0 st | 实时时间百分比 | steal (time given to other DomU instances) | |
| 第四行 | 3736.2 total | 物理内存总量(MB) | |
| 152.5 free | 空闲内存总量(MB) | ||
| 718.8 used | 使用的物理内存总量(MB) | ||
| 2864.9 buff/cache | 用作内核缓存的内存量(MB) | ||
| 第四行 | 0.0 total | 交换区总量(MB) | |
| 0.0 free | 空闲交换区总量(MB) | ||
| 0.0 used | 使用的交换区总量(MB) | ||
| 2726.0 avail Mem | 可用的内存(MB) |
第二部分
| 简写 | 全称 | 含义 |
| PID | Process Id | 进程ID |
| USER | User Name | 当前进程运行的用户 |
| PR | Priority | 优先级 |
| NI | Nice Value | 负值表示高优先级,正值表示低优先级 |
| VIRT | Virtual Image | 进程使用的虚拟内存总量(KB)。VIRT=SWAP+RES |
| RES | Resident size | 进程使用的、未被换出的物理内存大小(KB)。RES=CODE+DATA |
| SHR | Shared Mem size | 共享内存大小,单位(KB) |
| S | Status | 进程状态(D|R|S|T|Z),可以看后面那进程张状态表 |
| %CPU | cpu | CPU占用百分比 |
| %MEM | memory | 内存占用百分比 |
| TIME+ | TIME | 系统运行时间 |
| COMMAND | COMMAND | 运行的程序 |
进程状态表
| 状态值 | 含义 | 全称 |
| R | 运行 | running |
| D | 不可中断的睡眠状态 | uninterruptible sleep |
| S | 睡眠 | sleeping |
| T | 跟踪/停止 | traced or stopped |
| Z | 僵尸进程 | zombie |
| I | 空闲 | Idle |
| X | Dead | top命令看不到 |
一、查看内存的占用情况
free
-m MB单位显示
-h 表示以人类可读的方式显示
| 参数 | 含义 |
| total | 总内存 |
| used | 使用内存 |
| free | 空闲内存 |
| shared | 共享内存 |
| buff/cache | 缓冲区内存 |
| available | 可用内存 |
三、查看磁盘的占用情况
df -h
四、查看GC情况
查看java 进程几种方式
1.使用 ps -ef|grep java 即可查看java进程id
2.使用 jps -q 查看所有进程Id
3.使用 jps -m 查看进程i 并带上main参数信息
4.使用 jps -l 查看进程id 并带上应用程序jar和完成路径名
5.使用 jps -v 查看进程id 并带上jvm参数信息
进程的GC回收状态
jstat -gc 851827 2000
| 命令及参数 | 含义 |
| jstat | jdk自带的工具 |
| -gc | 查看gc的情况(还可以查看class/compile/gcold) |
| 34574 | 进程ID,本次要查看的进程ID为34574,生产上要根据上一步的jps获得 |
| 2000 | 每隔2000毫秒打印一次 |

保存进程的栈现场
jstack 34574 > jstack.log
| 参数或命令 | 含义 |
| jstack | jdk自带命令,可以查看栈现场的情况 |
| 34574 | 进程ID,本次要查看的进程ID为34574,生产上要根据上一步的jps获得 |
| > | 重定向 |
| jstack.log | 重定向到当前目录下的jstack.log,若没有则生成 |
对刚刚生成的栈现场文件进行分析,查看有多少个线程
grep 'java.lang.Thread.State' jstack.log | wc -l
| 参数或命令 | 含义 |
| grep | 匹配并过滤出 |
| ‘java.lang.Thread.State’ | 匹配并过滤出java.lang.Thread.State的文本内容 |
| jstack.log | 被过滤的文件 |
| | | 管道,用于将过滤出的结果传递给下一个命令 |
| wc | word count 统计 |
| -l | 按行统计,统计行数 |
查看线程是否有异样
grep -A 1 'java.lang.Thread.State' jstack.log | grep -v 'java.lang.Thread.State' | sort | uniq -c |sort -n
| 参数 | 含义 |
| grep -A 1 ‘java.lang.Thread.State’ | 匹配 java.lang.Thread.State并过滤文件,并关联出对应上下各1行 |
| jstack.log | 被匹配的文件 |
| | | 管道,将刚刚的输出结果作为输入 |
| grep -v ‘java.lang.Thread.State’ | 匹配不含java.lang.Thread.State的内容(这样只剩下上下各一行) |
| sort | 将所有行按照字典序排序 |
| uniq -c | 去除排序后相连重复的行 |
| sort -n | 以数字的形式排序 |
保存进程的堆现场
jmap -dump:format=b,file=heap.log 851827
| 参数或命令 | 含义 |
| jmap | jdk自带命令,可以查看堆现场的情况 |
| -dump:format=b | 以二进制的形式输出堆 |
| file=heap.log | 输出文件的文件名为heap.log |
| 851827 | 进程ID,本次要查看的进程ID为34574,生产上要根据上一步的jps获得 |
压缩heap.log 下载到本地
gzip -6 heap.log
解压后修改后缀名为hprof,在使用分析工具进行查看
浙公网安备 33010602011771号