记一次内存泄漏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 ...
随机推荐
- Afinal载入网络图片及下载文件用法
Afinal高速开发框架使用起来很方便.以下将解说怎样利用Afinal载入网络图片及下载文件: 先看效果图: 注意:使用Afinal前需加入Afinal的jar,能够在这里下载:http://down ...
- 装双系统(win7/win8/ubuntu)问题总结
1.假设你要安装双系统,装系统是最好安装winows,然后再装ubuntu,因此,不解决它自己入选,我一般装ubuntu时刻.第一分区删除.然后用U硬盘直接安装ubuntu.在这一刻ubuntu将投入 ...
- 大虾翻译(一):jQuery.extend()
本文是在JavaScript之三里面链接内容的中文翻译.我会尽可能做到信达雅且保持作者原意不变,OK,let's Go! jQuery.extend(target,[object1],[objectN ...
- 在CMD命令行和PowerShell中实现复制粘贴功能
在CMD命令行和PowerShell中实现复制粘贴功能 常常使用命令行或者PowerShell的朋友肯定会遇到这样的情况:粘贴文本非常easy,右键--选择粘贴就可以,可是想要复制命令 ...
- "伪中国移动client"--伪基站诈骗
一.简单介绍: 近日,百度安全实验室发现一款"伪中国移动client"病毒.犯罪分子通过伪基站方式大量发送伪10086的短信,诱导用户点击钓鱼链接:并在钓鱼页面诱导用户输入网银账号 ...
- 树莓派的演奏音符3 -- LCD1602显示文章
LCD1602它是低-cost输出装置.它具有体积小.简单的操作.低功耗优势.因此,在一些DIY 用它来输出关于产品的一些信息. 昨日在使用,尽管平局网上资源,但仍存在一些问题,确处理. 一.LCD1 ...
- NSIS:制作软件升级安装包
原文 NSIS:制作软件升级安装包 相信不是每个人写的软件都只发布一次就可以了,肯定要有修改和维护的情况发生.在这种情况下,您可能就需要一个软件的升级安装包了. 现在,我们就来一步步把这个安装包做 ...
- oracle10g获得Date类型字段无分,秒的解决方案!
一般的数据库中,DATE字段只表示日期,不包含日期信息,而Oracle数据库中的DATE数据类型是包含日期.时间的,对于不同的Oracle jdbc驱动版本号.对于该问题的处理都有些差别. 近期使用 ...
- TextView——setCompoundDrawables说明
Drawable drawable = mContext.getResources().getDrawable(R.drawable.duringtime); drawable.setBounds( ...
- java 突击队注意事项:在路上
情绪: 灵活:让标准成为价格值.为了给你一个想法和标准,你可以有一个不同的使用.不是死扣定理.决这个问题. 看书:分两类,一类依据知识点进行罗列.并且结构清晰,能够看完一章有选择进行总结(不是笔记,总 ...