首页 > 系统相关 >内存泄漏排查

内存泄漏排查

时间:2022-10-06 15:23:05浏览次数:54  
标签:泄漏 java log 查看 Thread 排查 内存 进程

一、查看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,在使用分析工具进行查看

 

标签:泄漏,java,log,查看,Thread,排查,内存,进程
From: https://www.cnblogs.com/Ali0826/p/16757539.html

相关文章