记一次内存泄漏DUMP分析
自从进入一家创业公司以后,逐渐忙成狗,却无所收获,感觉自身的技术能力用武之地很少,工作生活都在业务逻辑中颠倒。
前些天线上服务内存吃紧,让运维把DUMP拿下来,分析一下聊以自慰。
先来统计一下大对象信息
- 0:000> !dumpheap -min 85000 -stat
- Statistics:
- MT Count TotalSize Class Name
- 000007feec34c168 7 57734750 System.Char[]
- 000007feec34aee0 14 115469904 System.String
- 00000000013032d0 101 621925414 Free
- Total 122 objects
- Fragmented blocks larger than 0.5 MB:
- Addr Size Followed by
- 000000010d382018 2.8MB 000000010d645e90 System.String
- 000000010d971aa8 1.8MB 000000010db43530 System.Random
- 000000010db70bd0 1.1MB 000000010dc8e238 System.String
- 000000010dd2f6a8 0.7MB 000000010ddd9160 System.Random
- 000000010ddd92e8 1.1MB 000000010dee8d38 System.Security.Cryptography.SafeHashHandle
- 000000010e223090 3.0MB 000000010e51dcc8 System.Random
看看字符串
- 0:000> !dumpheap -type System.String -min 85000
- Address MT Size
- 00000004ffed5250 000007feec34aee0 12721650
- 0000000501f4aec0 000007feec34aee0 1322018
- 000000050208dae8 000007feec34aee0 1322022
- 00000005021d0710 000007feec34aee0 12726120
- 0000000502df3678 000007feec34aee0 12726124
- 00000005121b3168 000007feec34aee0 12726120
- 000000052001c2b0 000007feec34aee0 12721654
- 0000000521053930 000007feec34aee0 732168
- 00000005211b9120 000007feec34aee0 732168
- 00000005216efa08 000007feec34aee0 12726124
- 0000000522312978 000007feec34aee0 12726124
- 00000005307564d8 000007feec34aee0 4780744
- 0000000531074a50 000007feec34aee0 4780748
- 0000000531503d20 000007feec34aee0 12726120
- Statistics:
- MT Count TotalSize Class Name
- 000007feec34aee0 14 115469904 System.String
查看字符串详情
- 0:000> !DumpObj /d 0000000501f4aec0
- Name: System.String
- MethodTable: 000007feec34aee0
- EEClass: 000007feebcb3720
- Size: 1322018(0x142c22) bytes
- File: C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
- String: {"SalePriceStrategyList":[{"SaleRuleID":5178,"StrategyTypeID":5,"StrategyTypeName":"标准售......
- 0:000> dc 00000004ffed5250 L1000
- 00000004`ffed5250 ec34aee0 000007fe 00610eec 0022007b ..4.......a.{.".
- 00000004`ffed5260 00720050 0064006f 00630075 00490074 P.r.o.d.u.c.t.I.
- 00000004`ffed5270 00220064 0034003a 00390037 002c0031 d.".:.4.7.9.1.,.
- 00000004`ffed5280 00500022 006f0072 00750064 00740063 ".P.r.o.d.u.c.t.
- 00000004`ffed5290 0061004e 0065006d 003a0022 4e3d0022 N.a.m.e.".:.".=N
- 00000004`ffed52a0 002d6c5f 683c9999 62c991cc 901a76f4 _l-...<h...b.v..
- 00000004`ffed52b0 00228f66 0022002c 00750053 004e0062 f.".,.".S.u.b.N.
- 00000004`ffed52c0 006d0061 00220065 0022003a 002c0022 a.m.e.".:.".".,.
- 00000004`ffed52d0 00440022 00700065 00610052 0067006e ".D.e.p.R.a.n.g.
- 00000004`ffed52e0 004c0065 00730069 00220074 006e003a e.L.i.s.t.".:.n.
- 00000004`ffed52f0 006c0075 002c006c 00440022 00730065 u.l.l.,.".D.e.s.
- 00000004`ffed5300 00520074 006e0061 00650067 0069004c t.R.a.n.g.e.L.i.
- 00000004`ffed5310 00740073 003a0022 007b005b 00520022 s.t.".:.[.{.".R.
- 00000004`ffed5320 006e0061 00650067 00640049 003a0022 a.n.g.e.I.d.".:.
- 00000004`ffed5330 00330022 00220037 0022002c 00610052 ".3.7.".,.".R.a.
- 00000004`ffed5340 0067006e 004e0065 006d0061 00220065 n.g.e.N.a.m.e.".
- 00000004`ffed5350 0022003a 6c5f4e3d 002c0022 00450022 :.".=N_l".,.".E.
- 00000004`ffed5360 004e006e 006d0061 00220065 0022003a n.N.a.m.e.".:.".
- 00000004`ffed5370 0069004c 0069006a 006e0061 00220067 L.i.j.i.a.n.g.".
- 00000004`ffed5380 0022002c 00610052 0067006e 00540065 ,.".R.a.n.g.e.T.
- 00000004`ffed5390 00700079 00220065 0031003a 002c0036 y.p.e.".:.1.6.,.
发现是指纹或销控缓存反序列产生的
同理看看字符数组,结果类似。
继续,分析线程
- 0:000> !threads
- ThreadCount: 1710
- UnstartedThread: 1
- BackgroundThread: 122
- PendingThread: 0
- DeadThread: 1587
- Hosted Runtime: no
发现deadthread很多,用类似的方式,发现这些线程的地址都在终结器队列GCHandle中,推测室短时间内AMQ批量触发而无法大量共用线程池中的现有线程引起新开辟了很多额外的线程。通过调用栈发现的确如此:
- 0:000> !clrstack
- OS Thread Id: 0x5718 (42)
- Child SP IP Call Site
- 0000000013e8e6c8 000000007706df6a [GCFrame: 0000000013e8e6c8]
- 0000000013e8e798 000000007706df6a [HelperMethodFrame_1OBJ: 0000000013e8e798] System.Threading.Monitor.ObjWait(Boolean, Int32, System.Object)
- 0000000013e8e8b0 000007fe9302c6da Apache.NMS.ActiveMQ.Threads.DedicatedTaskRunner.Run()
- 0000000013e8e930 000007feec19f8a5 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
- 0000000013e8ea90 000007feec19f609 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
- 0000000013e8eac0 000007feec19f5c7 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
- 0000000013e8eb10 000007feec1b2d21 System.Threading.ThreadHelper.ThreadStart()
- 0000000013e8ee28 000007feed27f713 [GCFrame: 0000000013e8ee28]
- 0000000013e8f158 000007feed27f713 [DebuggerU2MCatchHandlerFrame: 0000000013e8f158]
- 0000000013e8f338 000007feed27f713 [ContextTransitionFrame: 0000000013e8f338]
- 0000000013e8f528 000007feed27f713 [DebuggerU2MCatchHandlerFrame: 0000000013e8f528]
推测是由于AMQ短时间内批量触发指纹、销控缓存更新引起。
本来想着手解决缓存反序列化大对象、改善AMQ批量触发开辟过多线程、以及是否有未退订的订阅等问题,不过产品过来说,业务码好了没》》》
记一次内存泄漏DUMP分析的更多相关文章
- JVisualVM简介与内存泄漏实战分析
JVisualVM简介与内存泄漏实战分析 学习了:https://blog.csdn.net/kl28978113/article/details/53817827
- Day 18: 记filebeat内存泄漏问题分析及调优
ELK 从发布5.0之后加入了beats套件之后,就改名叫做elastic stack了.beats是一组轻量级的软件,给我们提供了简便,快捷的方式来实时收集.丰富更多的数据用以支撑我们的分析.但由于 ...
- Android - 看似内存泄漏,实则不是,记一次内存泄漏的案例分析
APP中常常会存在内存泄漏的问题,一个简单的测试方法是,多次进入和退出同一页面(Activity),使用adb shell中的dumpsys meminfo com.android.settings ...
- Java内存泄漏及分析
对于内存泄漏,首先想到的是C语言,其实不然,java中也有各种的内存泄漏.对于java程序员,在虚拟即中,不需要为每一个新建对象去delete/free内存,不容易出现内存泄漏.但是,正 是由于这种机 ...
- Linux高级调试与优化——内存泄漏实战分析
最近在整理Linux调试方面的文档,正好碰到了一个内存泄漏踩栈的问题,借此机会记录一下分析过程. 首先,发现问题之后,赶紧看一下产生coredump文件没有,果不其然,产生了coredump,果断上g ...
- AndroidStudio 内存泄漏的分析过程
前言部分这次泄漏是自己代码写的太随意引起的,讲道理,代码写的太为所欲为了,导致有些问题根本就很难发现. 泄漏产生的原因,由于activity未被回收导致.这里给我们提出的一个警示,在使用上下文的时候, ...
- Yii2 框架跑脚本时内存泄漏问题分析
现象 在跑 edu_ocr_img 表的归档时,每跑几万个数据,都会报一次内存耗尽 PHP Fatal error: Allowed memory size of 134217728 bytesex ...
- JVisualVM 模拟一次内存泄漏场景分析
首先贴一段内存泄漏的代码并且执行.(内存泄漏:GC回收不掉的实例对象) package com.example.demo.memoryLeakDemo; import com.example.demo ...
- iis站点内存泄漏问题分析
在一次上线过程中iis内存飙升,随后跟运维要到站点的dump文件,使用windbg分析了clr的内存分配,找到了问题的症结,先记录如下: 使用windbg加载dump文件 1.打开windbg,Fil ...
随机推荐
- POJ 3237 Tree (树链拆分)
主题链接~~> 做题情绪:了. 解题思路: 主要注意如何区间更新就ok了 . 树链剖分就是树上的线段树. 代码: #include<iostream> #include<sst ...
- K60 启动过程分析
很高兴老师借给我一K60的开发板,趁着暑假好好鼓捣鼓捣! 有了上图的过程分析我想心里大概有个低了吧! 以下看代码: /* CodeWarrior ARM Runtime Support Library ...
- 好大滴坑, Spring MVC覆盖了Trsaction
好大滴坑. Spring MVC覆盖了Trsaction 解决方式: <!-- package-scan 4 Spring MVC --> <context:component-sc ...
- C代码分析器(一个 公开赛冠军)
最近心血来潮,我希望能写一个通用的代码分析工具(其实这个词有点太.事实上为C代码).看到这几天我看到代码头晕眼花,尽管Source Insight救命,仍然没有足够的智慧思考很多地方. 如今主要遇到的 ...
- Android SystemUI源代码分析和修改
1.在导航栏中添加音量加减button 一些Android音量调节button.或者从保护实体按键的角度考虑,就须要在导航栏的虚拟按键中加入音量加减调节按键. 效果例如以下图所看到的: 实现步骤例如以 ...
- QTbutton设置背景颜色和文字显示位置设置
QPushButton * pQBtn = new QPushButton( cBuff, this ); pQBtn->setStyleSheet("text-align: left ...
- android 电平信号状态识别View平局
1.前言 级信号状态View在今天的Android系统是常见.状态的图标就很的经典,有几种状态,到了快没电的时候有些还会闪烁提示用户充电:还有的就是一些地图App的GPS信号强度的提示.Wifi信号强 ...
- ASP.NET MVC (Razor)开发
ASP.NET MVC (Razor)开发 过去我们使用过一些周报工具来完成项目组或部门的周报填写与考核工作,但多少有些不理想,要么功能太过简单,要么功能特别繁杂,不接地气,使用不便. 后来我们就考虑 ...
- 左右v$datafile和v$tempfile中间file#
v$datafile关于存储在文件中的数据视图的信息,v$tempfile查看存储在一个临时文件中的信息. 有两种观点file#现场,首先来看看官方文件的定义: V$DATAFILE This vie ...
- ZOJ3605-Find the Marble(可能性DP)
Find the Marble Time Limit: 2 Seconds Memory Limit: 65536 KB Alice and Bob are playing a game. ...