什么情况会导致我内存狂飙
- 过多线程,java每个thread必需有1m内存占用
核查步骤
- 查看机器内存使用情况
- 定位主要进程top命令,按下M(按内存占用由大到小排序),输出PID
- 查看该进程中线程情况top -Hp PID,查看数量1000是节点值(linux的一个进程默认只允许有1024个线程)
- 定位代码位置,dump生成jvm运行快照
机器内存使用情况
free -h
内存是排查线上问题的重要参考依据,free 是显示的当前内存的使⽤,-h 表示⼈类可读性。
参数说明:
total :内存总数
used:已经使⽤的内存数
free:空闲的内存数
shared:被共享使⽤的物理内存⼤⼩
buffers/buffer:被 buffer 和 cache 使⽤的物理内存⼤⼩
available: 还可以被应⽤程序使⽤的物理内存⼤⼩
定位进程
top 64421 然后按M(以内存占用率大小的顺序排列进程列表)
线程PID 64427
定位线程
top -Hp 64421
查看Threads:38 total,线程数量
如果过多需要定位代码位置:
- 没有使用线程池
- DB或者其他组件配置的线程数量太多
定位代码dump
jmap -dump:format=b,file=dump.hprof PID
注意:如果是线上环境,注意dump之前必须先将流量切走,否则大内存dump是直接卡死服务。
jmap -dump:format=b,file=dump.hprof 64421
下载文件,使用工具查看dump.hprof。比如:MAT、VisualVM、jhat