首页 > 系统相关 >OOM内存泄露速查备忘录

OOM内存泄露速查备忘录

时间:2024-02-11 11:12:05浏览次数:27  
标签:线程 dump OOM pid GC 内存 jstat 速查

本文整理了一份OOM内存泄露问题速查备忘录,详细见下文。

1、核心步骤

  1. top、free、df三连,查看CPU、内存、磁盘的大致情况。
  2. netstat -lp 查看端口占用情况。
  3. 导出内存dump文件:
# 保存了堆内存现场 
jmap -dump:format=b,file=heap.dump pid
# 强制保存了堆内存现场
jmap -F -dump:format=b,file=heap.dump pid
  1. 保存线程栈:
# 保存了线程栈的现场
jstack pid > jstack.log

2、辅助工具

  • jstat -gc[gcutil] pid [interval]查看JVM垃圾回收情况。通过 jstat 查看 GC 信息,首先就是判断 GC 时间是否较长,GC 发生是否频繁,然后看是否经常性进行 FullGC。
# 如:jstat -gc pid 1000,持续跟踪如1S一次。查看java堆的状况,显示具体数值。
jstat -gc pid 1000
# 通过 jstat -gcutil 5 1000命令查看GC信息,其中5代表进程号,1000代表显示时间。查看堆中各个区域已使用空间占其总空间的百分比。
jstat -gcutil pid 1000

  • 借助MAT(Eclipse Memory Analyzer)工具分析dump文件,分析内存情况。
  • 直接用文本工具打开jstack文件,分析线程占用情况。
  • 借助VisualVM更直观:

3、分析过程

3.1、分析线程栈

直接通过文本工具打开jstack.log,搜索业务相关包名,应该大致能定位出问题:

3.2、分析内存

  1. 用MAT工具打开dump文件

  1. 一般打开Histogram视图,这样能快速地发现问题,也可以打开Leak Suspects(泄露嫌疑),如下图:

寻找这个对象被哪些地方引用了,如下图:

查看大对象,找出自己业务相关的关键引用:

根据上面GC Roots的结果,在结合自身的业务代码排查下,一般都会找到线索,比如:

  • 某个线程远程调用了接口返回的对象,一直被使用未能释放
  • 每次执行的数据量过大
  • 流没有关闭
  • 死循环 或者 递归次数太多
  • 定时任务执行频率过高,在任务没执行完毕时又在持续执行,导致积压了大量对象
  • ......

4、总结

本文整理了一份OOM内存泄露问题速查备忘录。核心内容是:

  • top、free、df三连,然后netstat、jstat工具跟上。
  • 紧接着赶紧jmap、jstack保存现场,然后重启应用。
  • MAT分析问题,修改问题,重新发布。

本篇完结!感谢你的阅读,欢迎点赞 关注 收藏 私信!!!

原文链接:http://www.mangod.top/articles/2023/10/09/1696840322478.htmlhttps://mp.weixin.qq.com/s/G6QEHNK4oLcPmnWgSvWfnQ

标签:线程,dump,OOM,pid,GC,内存,jstat,速查
From: https://www.cnblogs.com/mangod/p/18013263

相关文章

  • 探索C语言的内存魔法:动态内存管理解析
    ✨✨欢迎大家来到贝蒂大讲堂✨✨......
  • 内存和磁盘的关系
    通过使用内存来提高磁盘访问速度的机制称为磁盘缓存,指的是把磁盘中读出的数据存储在内存中,当该数据再次被读取时,不是从磁盘而是直接从内存中高速读出;把磁盘的一部分作为假想内存来使用的机制称为虚拟内存,借助虚拟内存,哪怕内存容量不足的计算机,也可以运行很大的程序;Wind......
  • Python获取 CPU 温度、CPU 占用、内存总空间、内存占用空间、系统磁盘总空间、系统磁
    先下载依赖pip3installpsutil代码importpsutil#获取CPU温度defget_cpu_temperature():try:temperatures=psutil.sensors_temperatures()if'coretemp'intemperatures:forentryintemperatures['coretemp']:......
  • 罕见的YTX版型!铭瑄H770YTX D5 WIFI背插主板评测:强大扩展能力 内存轻松上8000MHz
    一、前言:罕见的YTX版型常见的主板版型有ATX、M-ATX和ITX。不过随着电脑个性化时代的来临,为了满足玩家越来越苛刻的外观造型需求,铭瑄推出了全新的MS-终结者H770YTXD5WIFI背插主板。铭瑄H770YTXD5WIFI采用的是YTX版型,尺寸为24.5cm*17.5cm,长度与M-ATX主板一样,宽度与ITX主板相......
  • 云服务centos7 增加虚拟内存
    1、查看磁盘使用情况free-h而Mem就表示购买阿里云时候的内存,我们能够看到只有3.9G,并且已经使用了3.7G。 2、添加Swap分区使用dd命令创建名为swapfile的swap交换文件(文件名和目录任意):ddif=/dev/zeroof=/var/swapfilebs=1024count=4194304dev/zero是Linux的一种特殊字......
  • CF1428D Bouncing Boomerangs 题解
    解题思路很简单的贪心。观察发现以下性质:当\(a_i=2\)时,这一行一定只有两个目标,且第二个目标一定位于一个\(a_j=1\)的格子内;当\(a_i=3\),那么当前列右边某一列发生转向的地方,\(a_j\not=0\);那么这道题就基本已经做出来了。因为\(a_i=3\)的格子转向格可以在任意非\(0\)......
  • 【幻兽帕鲁教程】服务器内存优化
    大量幻兽帕鲁玩家反馈,开服后在进行一段时间的游戏后会出现内存溢出导致异常退出游戏的情况,这里为大家提供一些缓解内存不足的方案作参考: 一:为Windows服务器配置虚拟内存本小节以WindowsServer2022为例,其他版本的Windows操作系统类似,可据此做参考。1、打开服务器的控......
  • 读了啥:JVM内存调优
    读了啥周志明的深入理解Java虚拟机中的调优案例。第一个案例背景一个网站部署在JVM上,而Java堆大小固定在了12G,但是总会出现长时间无法响应的情况。使用了吞吐量优先收集器:可能是ParallelScavenge和ParallelOld收集器。问题网站直接从磁盘拷贝文档到堆内存中,文档过大导致......
  • c语言实现内存池
    概要所谓内存池,顾名思义和线程池的设计原理是一样的,为了减少频繁申请释放内存而带来的资源消耗,减少释放内存后产生的内存碎片。设计理念为了方便管理内存池的设计通常是划分出一定数量的内存块,这些内存块的长度是一样的;用户申请内存块时返回空闲的内存块地址,如果内存块使用完......
  • 索引构建磁盘IO太高,巧用tmpfs让内存来帮忙
    在文本索引构建这种需要大量占用磁盘IO的任务,如果正巧你的内存还有点余粮,是否可以先索引存储到内存,然后再顺序写入到磁盘呢?,需要大量占用磁盘IO,如果正巧你的内存还有点余粮,是否可以先索引存储到内存,然后再顺序写入到磁盘呢?将Linux的内存变为磁盘,可以通过tmpfs文件系统实现。tmpf......