记一次内存飙升的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%基本就挂机了,或者监控数据缺失也基本是挂机了.此时应当马上 ...
随机推荐
- Taurus.MVC 2.3.4 :WebAPI 文档集成测试功能升级:WebAPI批量自动化测试功能。
前言: 最近升级了一下Taurus.MVC,现在最新版本是:Taurus.MVC 2.3.4,源码版本和nuget同步. 下面分三个步骤介绍下新版本的WebAPI批量自动化测试功能. 1.启用WebA ...
- 【转载】requests库的7个主要方法、13个关键字参数以及响应对象的5种属性
Python爬虫常用模块:requests库的7个主要方法.13个关键字参数以及响应对象的5种属性 原文链接: https://zhuanlan.zhihu.com/p/67489739
- springboot 使用DruidDataSource 数据源
一.添加依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</art ...
- Jdbc Template初步了解
JdbcTemplate简介 Java语言提供了jdbc来访问数据库,在jdbc api中需要手动的获取和释放连接等资源,使用起来需要做许多重复的工作.Spring在jdbc api的基础上做了抽象和 ...
- 链表(python)
一.链表和数组 在编写代码中,我们储存的数据是存储于内存当中,内存就像一块块并列排序的小方盒,每个小方盒都有自己地址,我们储存的数据就在这样一个个小方盒当中. 这些数据存放的结构有两种基本方式,数组和 ...
- error PRJ0003 : 生成“cmd.exe”时出错 2010-01-19 22:26
今天用vs2005编译时代码时竟然出现了error PRJ0003 : 生成“cmd.exe”时出错这样的错误,这不是刺激我吗,我们先看msdn的解释吧. 错误消息 生成“command line”时 ...
- 你真的会做 2 Sum 吗?| 含双重好礼
小预告:文末有两份福利,记得看到最后哦- 2 Sum 这题是 Leetcode 的第一题,相信大部分小伙伴都听过的吧. 作为一道标着 Easy 难度的题,它真的这么简单吗? 我在之前的刷题视频里说过, ...
- C# WebAPI项目,不支持HttpPut请求!!!
有点标题党了,这个异常的现象是这样的: 我有一个正在跑的项目,要对接第三方厂家的设备. 对方给的接口文档,里面有一个接口是需要我这边实现的,要求必须是PUT请求方式. 所以我在项目基础上,新增一个W ...
- angular schametics 使用记录
什么是 schametics Schematics是Angular团队发布的一个代码生成工具.它提供了API,可以操作文件并在Angular项目中添加新的依赖项,ng cli 创建模板就是用它. 它也 ...
- .NET Core + K8S + Apollo 玩转配置中心
1.引言 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理 ...