首页 > 系统相关 >记一次内存溢出排查(dump文件)

记一次内存溢出排查(dump文件)

时间:2024-10-27 23:18:07浏览次数:6  
标签:dump 查看 排查 线程 内存 使用 堆栈

问题

  • 某天晚上七点多,我们的一个服务节点挂掉了,查看了服务器状态,内存使用异常
  • 此时间段是业务量较少的时间段,仅有此节点挂掉了,另外3个节点正常
  • 我们使用Spring cloud微服务架构,该服务部署了4个节点,一个节点挂掉暂不影响服务的正常使用
  • 使用jps命令查看了 gc 情况
    在这里插入图片描述
  • 使用jmap -dump命令导出了此时的线程堆栈,之后重启了服务,一切正常,没再发现有内存异常增长的情况,确认为偶发事件

分析与解决

  • 同事使用idea打开分析了bin文件,发现是有个对象的实例数量异常,有274万多
  • 初步判断是该对象实例,导致的内存溢出
    在这里插入图片描述
  • 我的idea版本比较低,达不到这么好的分析效果,于是使用jdk自带的jvisualvm打开文件,发现看的东西也比较有限,我们使用的还是jdk1.8,版本太低了
    在这里插入图片描述
  • 重新从网上下载了一个 VisualVM2.0.7,果然效果好很多,能看到线程情况
  • 首先打开软件,load我们的bin文件在这里插入图片描述
  • 可以查看对象内存占用和线程堆栈,这2个最有用。查看了对象占用和引用,发现这个对象的实例都是在集合list里面,再去找引用,就没了
    在这里插入图片描述
  • 看到线程堆栈,打开查看细节,不太方便搜索,就拷贝到vscode里操作,发现该对象只出现5次,初步确定不是大量请求,而是某一个请求导致的
    在这里插入图片描述
  • 根据堆栈里的类名和行数,可以轻松定位到对应的类和行数。逐个排查,排查到第4个发现了问题,参数为空导致查询条件被跳过,查询了两百多万条数据
    在这里插入图片描述
  • 低级代码错误,使用了带判断条件的 eq 方法,不符合当前的业务情况,当证件号码为空时,跳过了此条件
    在这里插入图片描述
  • 解决方法很简单,判断条件前置即可
    在这里插入图片描述

总结

  • 对于内存溢出OOM等情况,如果有保留现场,及时使用命令排查最好
  • 对于生产环境,使用命令导出dump文件,就赶紧重启服务吧。只要有dump文件,基本可以百分百确定能找到问题
  • 首先查看内存占用情况,查看是否有自己的类及实例异常增多
  • 再查看线程堆栈,查看这些类的来源(一般都是查询,集合遍历等)
  • 针对类在线程堆栈里出现的情况,逐个排查,找到对应的类和行数,不难找出问题
  • vs code 打开大的文本文件,很好用

标签:dump,查看,排查,线程,内存,使用,堆栈
From: https://blog.csdn.net/u010882234/article/details/142828544

相关文章

  • CUDA编程学习 (3)——内存和数据定位
    1.CUDAMemories1.1GPU性能如何所有thread都会访问globalmemory,以获取输入的矩阵元素在执行一次浮点加法时,需要进行一次内存访问,每次访问传输4字节(即32位浮点数)1FLOP(浮点运算)对应4字节的内存带宽假设的GPU性能:该GPU的峰值浮点计算能力为1,600GFL......
  • 探索C++的奥秘之C/C++内存管理
    一个程序当中的数据主要有以下几类:局部数据、静态数据和全局数据、常量数据、动态申请数据。1.C/C++内存分布1.栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。2.内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系......
  • cpu访问寄存器的速度为什么比内存快
    cpu访问寄存器的速度比内存快主要是因为寄存器直接位于cpu内部,无需通过数据总线进行数据传输,减少了数据访问的延迟。同时,寄存器使用的是高速硅基技术,其存取速度远超内存,使得CPU能够更快速地读写数据。CPU、寄存器和内存是计算机系统中的关键组成部分,它们共同作用,支持计算机进行高......
  • c语言中整数在内存中的存储
    整数的二进制表示有三种:原码,反码,补码有符号的整数,三种表示方法均有符号位和数值位两部分,符号位都是用‘0’表示“正,用1表示‘负’最高位的以为被当作符号位,剩余的都是数值位。整数的原码,反码,补码都相同负整数的三种表示方法各不相同   原码:直接将数值按照正负数的形......
  • CPU如何通过内存地址访问内存:寻址方式
    寻址方式:物理寻址分段寻址虚拟寻址分页寻址:引申出多级页表起源:寻址方式的发展取决于CPU位数和内存大小,16位就用物理分段寻址,32位用虚拟分段寻址或者2级分页寻址,64位一定用4级分页寻址了CPU的位数决定了:寻址能力:能够直接寻找地址的范围,比如16位的cpu只能找到从0......
  • linux查看某个进程的内存占用
    在Linux中,查看某个进程的内存占用可以通过多种方法实现。以下是几种常用的方式:1.使用 top 命令top 命令可以实时显示系统中运行的进程,并且显示每个进程的内存使用情况。运行 top 命令:top在 top 界面中,找到你想要查看的进程:%MEM:表示进程使用的物理内存的百分......
  • c语言之正负整数在内存中的存储本质
    int、short、long、longlong是如何定义变量的        我们先从最为我们所知的定义变量入手,当我们用int定义一个变量的时候,这个变量是整型,长度是4个字节,不同的操作系统下由int定义的变量长度有可能不同,当然对于short、long、longlong也是同样如此,因此为了使大家更清......
  • 数据在内存中的储存
    今天我们来深入了解一下各项数据在内存中的存储一.整数在内存中的存储这个众所的周知昂,咱们之前在讲解操作符的时候提到过一嘴,整数在内存中的存储形式——那就是以二进制的形式储存,记不清也没关系,很简单,咱们今天一起来回顾一下:整数的二进制表现形式有三种:原码、反码、补码......
  • C++ (7) 内存管理:掌握魔法能量的流动
    内存管理:掌握魔法能量的流动在C++的魔法世界中,内存管理是一项至关重要的技能。它涉及到程序如何分配和释放内存资源。如果处理不当,可能会导致程序崩溃或内存泄漏,就像一个魔法师失去了对魔法能量的控制。现在,让我们学习如何成为一个负责任的魔法师,掌握内存管理的艺术。6.......
  • 动态内存管理详解
    目录1.为什么要有动态内存分配2.malloc和free2.1malloc2.2free3.calloc和realloc3.1calloc3.2realloc4.常⻅的动态内存的错误4.1对NULL指针的解引⽤操作4.2对动态开辟空间的越界访问4.3对⾮动态开辟内存使⽤free释放4.4使⽤free释放⼀块动态开辟内存的......