windbg分析net程序内存泄漏问题
1 问题简介
有客户反馈,打了最新补丁后,服务器的内存暴涨,一直降不下来,程序非常卡。在客户的服务器上抓了一个dump文件,开始分析。
分析问题的思路:
1、找到是那些资源占用了大量内存?
2、找到是什么原因导致内存不释放?
3、根据分析信息定位问题代码。
2 分析问题
2.1 查看GC堆的内存占用情况
Net程序大部分内存泄漏是由于没有及时垃圾回收导致的,就从GC堆开始分析。
!eeheap -gc

统计一下,有8个GC堆(因为有8个CPU核),每个堆大概在1个G左右的大小,GC堆加起来大概8个G左右。对比一下dump文件的大小为8.86个G,这个信息也就很明确了,内存都被GC堆给占用了。

挑选heap 0来分析,发现900多M内存都在第二代里,说明对象被根引用了,没有被及时释放,导致内存泄漏。我们重点分析第二代里的对象。
2.2 分析GC堆 heap 0的第二代对象
分析所有堆会比较慢,我们只分析heap0的第二代对象。
!dumpheap -stat 00000218c75d1000 0000021902a69720

发现Kingdee.BOS.JSON.JSONArray,System.Object[],System.String 这三个类型占了700多M内存,就重点看上面的三个类型。
2.2.1 分析System.String
分析一下是否有大于200个字节的长字符,看看是不是超大的字符串占用了大量内存:
!dumpheap -mt 00007ffdb9386948 -stat -min 200 00000218c75d1000 0000021902a69720

发现大字符串的数量很少,才占用3M空间,推测应该都是一些小的字符串对象,由于string对象数量有1000万左右,如果继续分析string类型,收获会比较小,搞不清楚到底是那些string对象引起的占用大量内存的。String类型肯定是被其他类型引用的, System.Object[]也是类似,所以我们重点分析Kingdee.BOS.JSON.JSONArray
2.2.2 分析Kingdee.BOS.JSON.JSONArray对象
分析Kingdee.BOS.JSON.JSONArray的方法表:!dumpheap -mt 00007ffd5c24a068 00000218c75d1000 0000021902a69720

发现了有大量的40个字节的对象,ctrl+break中断一下,随机挑选一个对象,看看里面到底是什么内容。
查看Kingdee.BOS.JSON.JSONArray的对象: !do 00000218cc5002a0

继续查看明细项数组:items: !da 00000218cc575d60

是一个object[]数组,看起来是Kingdee.BOS.JSON.JSONArray对象引用了object[]数组。
继续查看数组中的对象:!do 00000218cc50b438

发现数组的项是一个Kingdee.BOS.JSON.JSONArray对象
继续查看对象的items数组:!da 00000218cc50b490

查看最终的明细项
!do 00000218cc50b310
!do 00000218cc50b3a0
能看到下面的字符串:“ABCFPZLB”,“ABC分配组列表”等字符串。
2.2.3 查找Kingdee.BOS.JSON.JSONArray根
找到了出问题的明细内存内容后,我们还需要找到出问题的代码到底在哪?看看能从根引用上能不能找到更多的线索。可以看看Kingdee.BOS.JSON.JSONArray对象到底是被那个根引用?
!gcroot -nostacks 00000218cc5002a0

Kingdee.BOS.JSON.JSONArray对象被缓存了,在gc句柄表被固定住了,不能被垃圾回收器回收,所以导致内存泄漏了。由于根对象列表没有发现一些更有价值的类型,我们只能通过上面的二个线索来推测问题.
线索1、“ABCFPZLB”,“ABC分配组列表”等字符串 看起来像菜单编码、名称
线索2、这些字符串被缓存了
推断出:可能菜单信息的缓存出了问题。
我们也可以看看堆栈信息,运气好的话,能从堆栈中看到一些可疑的堆栈。查看所有线程的堆栈:~*e !clrstack
在这个案例中,还真是发现了可疑的堆栈

GetMenuArrayForCache这个方法没有命中缓存。查看源码后发现,这个缓存的key有问题,命中率很低,导致大量重复的数据被缓存。
3 经验总结
使用缓存时,要考虑缓存的命中率,有效期。要评估一下各种情况下,缓存占用的内存可能会达到一个什么样的量。本案例的问题就是缓存的命中率低,导致了生成大量的缓存,没有及时释放引发的内存问题。
windbg分析net程序内存泄漏问题的更多相关文章
- Java虚拟机性能管理神器 - VisualVM(6) 排查JAVA应用程序内存泄漏【转】
Java虚拟机性能管理神器 - VisualVM(6) 排查JAVA应用程序内存泄漏[转] 标签: javajvm内存泄漏监控工具 2015-03-11 18:30 1870人阅读 评论(0) 收藏 ...
- Net Memory Profiler 分析.Net程序内存泄露
Net Memory Profiler 分析.Net程序内存泄露 Haozes's Tech Space 人類的全部才能無非是時間和耐心的混合物 使用.Net Memory Profiler 分析.N ...
- 在Eclipse中使用MAT分析Android程序内存使用状况(转)
对于Android这种手持设备来说,通常不会带有太大的内存,而且一般用户都是长时间不重启手机,所以编写程序的时候必须要非常小心的使用内存,尽量避免有内存泄露的问题出现.通常分析程序中潜在内存泄露的问题 ...
- C/C++应用程序内存泄漏检查统计方案
一.前绪 C/C++程序给某些程序员的几大印象之一就是内存自己管理容易泄漏容易崩,笔者曾经在一个产品中使用C语言开发维护部分模块,只要产品有内存泄漏和崩溃的问题,就被甩锅“我的程序是C#开发的内存都是 ...
- C++程序内存泄漏检测方法
一.前言 在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成“统一”的标准.而在W ...
- 【转】Unix下C程序内存泄漏检测工具Valgrind安装与使用
Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Goo ...
- .Net程序内存泄漏解析
一.概要 大概在今年三月份的时候突然被紧急调到另外一个项目组解决线上内存泄漏问题.经过两周的玩命奋战终于解决了这个问题这里把心路历程及思路分享给大家.希望可以帮助到各位或现在正遇到这样事情的小伙伴提供 ...
- MAT工具定位分析Java堆内存泄漏问题方法
一.MAT概述与安装 MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题.该工具提供了两种使用方式,一种是插件版,可以安装到Eclips ...
- 并发编程(四):ThreadLocal从源码分析总结到内存泄漏
一.目录 1.ThreadLocal是什么?有什么用? 2.ThreadLocal源码简要总结? 3.ThreadLocal为什么会导致内存泄漏? 二.ThreadLoc ...
随机推荐
- 微信小程序 功能函数 支付接口
// 订单生成返回数据,弹出是否支付模态 wx.showModal({ title: '微信支付', content: '确定支付吗?', success: function (res) { if ( ...
- UVA10054_The Necklace
很简单,求欧拉回路.并且输出. 只重点说一下要用栈来控制输出. 为啥,如图: 如果不用栈,那么1->2->3->1就回来了,接着又输出4->5,发现这根本连接不上去,所以如果用 ...
- P3758 [TJOI2017]可乐
题目描述 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上.这个可乐机器人有三种行为: 停在原地,去下一个相邻的城市,自爆.它每一秒都会随机 ...
- 【刷题】洛谷 P4234 最小差值生成树
题目描述 给定一个标号为从 \(1\) 到 \(n\) 的.有 \(m\) 条边的无向图,求边权最大值与最小值的差值最小的生成树. 输入输出格式 输入格式: 第一行两个数 \(n, m\) ,表示图的 ...
- 【BZOJ3675】【Apio2014】序列分割
Description 传送门 Solution 之前我也遇到过一次这种"两段之和乘积作为贡献"的问题:考虑把这一种\((\sum) *(\sum)\)的形式拆括号,就可以发现 ...
- spring管理hibernate,mybatis,一级缓存失效原因
mybatis缓存:一级缓存和二级缓存 hibernate缓存:一级缓存和二级缓存 关于缓存: 缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器, 其作用是为了减少应 ...
- 2017实习【Java研发】面经
标签: 实习 面经 Java研发 阿里.腾讯.华为 找2017暑假实习,经历过被腾讯拒绝的无奈,也有拿到阿里和华为offer的喜悦,找实习过程也有一段时间了,在此把之前的面试知识点和经历做个小总结,以 ...
- 解题:洛谷4721 [模板]分治FFT
题面 这是CDQ入门题,不要被题目名骗了,这核心根本不在不在FFT上啊=.= 因为后面的项的计算依赖于前面的项,不能直接FFT.所以用CDQ的思想,算出前面然后考虑给后面的贡献 #include< ...
- 简单易懂的GBDT
转https://www.cnblogs.com/liuyu124/p/7333080.html 梯度提升决策树(Gradient Boosting Decision Tree,GBDT)算法是近年来 ...
- (二)C语言文本流和二进制流的区别
转至:http://www.cnblogs.com/xiangzi888/archive/2011/11/10/2244336.html 一.首先回答,什么是文件,流 一个文件通常就是磁盘上的一段命名 ...