记一次内存飙升的Windbg
背景
突然间接到运维的报警,我们一个服务,内存找过了6GB的占用。才6GB 也不是很大,因为在处理别的事情,服务dump一下暂时一放,然后半小时之后,接到了运维的Kafka堆积报警。然后切换着重启了一下两个节点,Kafka消费速率回复正常,内存也从500M攀升到2GB后逐渐稳定。当天半夜,运维又报警,不过已经熟睡的我,并没有第一时间响应,第二天观察了一下服务,发现内存已经回归到了2GB左右。
内存飙升 与 Kafka堆积是否是一件事情
拉出表格来对比一下时间发现,这两个事情,时间节点基本上是能对的上的,所以大概率是一件事情。
dump分析
这么看来只要解了内存飙升的问题,Kafka堆积的问题应该也就会一并解决。那么,我们来分析一下,为什么会出现内存飙升吧。
首先看一下内存的整体使用情况
!dumpheap -stat
发现跟字符串关系很大,下边的Free应该是内存释放了,但是GC还没有及时回收的内存。
字符串1GB + 未回收内存3GB + 其他 林林总总 约等于 6G,差不多。下面我们重点追查一下这个字符串是怎么回事。
!DumpHeap -mt 000007fef956aee0 -min 200
出现了大量的 500Byte左右大小的字符串。这个大小,感觉像是业务字符串,并且应该是不重复的。先随便搞一条出来看看。
!do 000000008966ee78
这个内容有点莫名的眼熟,这不是我们发送消息给钉钉,然后再查询一下,钉钉的消息发送结果的返回值嘛?大概已经知道,是哪段逻辑出的错了,代码虽然不是我写的,但是我大概知道有这么一段逻辑。可是这段为什么会让内存暴增呢?查一下引用堆栈。
!GCRoot 000000008966ee78
发现上层的引用是一个List,我们打印一下这个List看看。
!DumpObj 0000000313b371a0
发现这个List好像是不小,12000+。粗略算算 12000 * 500 / GB 大概 5.xGB,但是现在内存只用了1GB多点,分析一下源码。
那个List 应该就是对应了这个tasks对象了。
后边会把查询的数据,序列化,然后放到这个对象上,在插入到数据库中。
简单总结一下原因,是因为一次性取出来的对象有点多(12000)条,然后挨个查询他的消息的发送结果,然后将网络调用的查询结果,序列化到对象上,然后再保存到数据库中。因为这些Model都被引用在一个List中,所以当12000个数据全都被处理完成之后才会释放List的内存。这样,每次处理,内存都跟坐过山车一样。
问题定位到了,解决方式就很简单了,随便搞。
啊,又解决一个问题,我变强了。
我的掘金 https://juejin.im/post/6868466964378222599/
记一次内存飙升的Windbg的更多相关文章
- 源码角度分析-newFixedThreadPool线程池导致的内存飙升问题
前言 使用无界队列的线程池会导致内存飙升吗?面试官经常会问这个问题,本文将基于源码,去分析newFixedThreadPool线程池导致的内存飙升问题,希望能加深大家的理解. (想自学习编程的小伙伴请 ...
- 记一次内存泄漏DUMP分析
自从进入一家创业公司以后,逐渐忙成狗,却无所收获,感觉自身的技术能力用武之地很少,工作生活都在业务逻辑中颠倒. 前些天线上服务内存吃紧,让运维把DUMP拿下来,分析一下聊以自慰. 先来统计一下大对象信 ...
- 记一次内存溢出的分析经历——thrift带给我的痛orz
说在前面的话 朋友,你经历过部署好的服务突然内存溢出吗? 你经历过没有看过Java虚拟机,来解决内存溢出的痛苦吗? 你经历过一个BUG,百思不得其解,头发一根一根脱落的烦恼吗? 我知道,你有过! 但是 ...
- 记一次CPU飙升BUG
图文地址:https://mp.weixin.qq.com/s?__biz=Mzg3NjEzODQ4NQ==&mid=2247483690&idx=1&sn=7c926f400 ...
- 记一次内存溢出的分析经历——使用thrift
背景: 有一个项目做一个系统,分客户端和服务端,客户端用c++写的,用来收集信息然后传给服务端(客户端的数量还是比较多的,正常的有几千个), 服务端用Java写的(带管理页面),属于RPC模式,中间的 ...
- Android - 看似内存泄漏,实则不是,记一次内存泄漏的案例分析
APP中常常会存在内存泄漏的问题,一个简单的测试方法是,多次进入和退出同一页面(Activity),使用adb shell中的dumpsys meminfo com.android.settings ...
- 记一次内存溢出java.lang.OutOfMemoryError: unable to create new native thread
一.问题: 春节将至,系统访问量进入高峰期.随之系统出现了异常:java.lang.OutOfMemoryError: unable to create new native thread.在解决这个 ...
- 记一次内存泄漏调试(memory leak)-Driver Monkey
Author:DriverMonkey Mail:bookworepeng@Hotmail.com Phone:13410905075 QQ:196568501 硬件环境:AM335X 软件环境:li ...
- 记一次内存无法回收导致频繁fullgc机器假死的思路
确定挂机 络绎不绝的来不同类型的bug 当bug滚滚而来时,不要怀疑,你的发布的应用基本是不可用状态了.观察哨兵监控数据,特别是内存打到80%基本就挂机了,或者监控数据缺失也基本是挂机了.此时应当马上 ...
随机推荐
- canvas小画板--(1)平滑曲线
功能需求 项目需求:需要实现一个可以自由书写的小画板 简单实现 对于熟悉canvas的同学来说,这个需求很简单,短短几十行代码就能实现: <!doctype html> <html& ...
- 学Java必看!零基础小白再也不用退缩了
程序员们!请往这儿看 对于JAVA的学习,可能你还会有许多的顾虑 不要担心 接着往下看吧 学Java前 一.数学差,英语也不好是不是学不好Java? 答案是:是~ 因为你在问这个问题的时候说明你对自己 ...
- 001_记一次ansible api二次开发遇到的小问题
在某次关于发布系统的项目中,需要调用ansible来发布任务,其中一段代码是初始化ansible的连接,并传入一个source(目标机器)的值,代码段如下: from .ansible_api imp ...
- 小谢第50问:vuex的五个属性-使用-介绍
一.Vuex 是什么? 官网:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 关键词:状态 ...
- Java基础—继承
继承是面向对象的核心特征之一,是由已有类创建新类的机制.利用继承机制,可以先创建一个具有共性的一般类,然后根据该一般类创建具有特殊性的新类,新类继承一般类的属性和方法,并根据需要增加自己的新属性和方法 ...
- SpringBoot2 整合Ehcache组件,轻量级缓存管理
本文源码:GitHub·点这里 || GitEE·点这里 一.Ehcache缓存简介 1.基础简介 EhCache是一个纯Java的进程内缓存框架,具有快速.上手简单等特点,是Hibernate中默认 ...
- DB2 创建存储过程保存:XX 后面找到异常标记 "END-OF-STATEMENT"。
存储过程最后一行加结束符@: 然后执行:db2 -td@ -vf /home/WGJ/proc_data_calculate.sql [slsadmin@localhost /]$ db2 -td@ ...
- JAVA—继承及抽象类
继承的概念 在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法. 与css中继承父元素属性类似 继承的 ...
- Qt之先用了再说系列-定时器的用法
Qt 定时器是一个比好用的东西,在此就地简单记录一下使用的方式: 1.首先包含头文件 #include <QTimer> 2.具体用法有几种,我就写其中2种吧 1>执行一次 这种方式 ...
- C#LeetCode刷题-数学
数学篇 # 题名 刷题 通过率 难度 2 两数相加 29.0% 中等 7 反转整数 C#LeetCode刷题之#7-反转整数(Reverse Integer) 28.6% 简单 8 字符串转整数 ...