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程序内存泄漏问题的更多相关文章

  1. Java虚拟机性能管理神器 - VisualVM(6) 排查JAVA应用程序内存泄漏【转】

    Java虚拟机性能管理神器 - VisualVM(6) 排查JAVA应用程序内存泄漏[转] 标签: javajvm内存泄漏监控工具 2015-03-11 18:30 1870人阅读 评论(0) 收藏  ...

  2. Net Memory Profiler 分析.Net程序内存泄露

    Net Memory Profiler 分析.Net程序内存泄露 Haozes's Tech Space 人類的全部才能無非是時間和耐心的混合物 使用.Net Memory Profiler 分析.N ...

  3. 在Eclipse中使用MAT分析Android程序内存使用状况(转)

    对于Android这种手持设备来说,通常不会带有太大的内存,而且一般用户都是长时间不重启手机,所以编写程序的时候必须要非常小心的使用内存,尽量避免有内存泄露的问题出现.通常分析程序中潜在内存泄露的问题 ...

  4. C/C++应用程序内存泄漏检查统计方案

    一.前绪 C/C++程序给某些程序员的几大印象之一就是内存自己管理容易泄漏容易崩,笔者曾经在一个产品中使用C语言开发维护部分模块,只要产品有内存泄漏和崩溃的问题,就被甩锅“我的程序是C#开发的内存都是 ...

  5. C++程序内存泄漏检测方法

    一.前言 在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成“统一”的标准.而在W ...

  6. 【转】Unix下C程序内存泄漏检测工具Valgrind安装与使用

    Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Goo ...

  7. .Net程序内存泄漏解析

    一.概要 大概在今年三月份的时候突然被紧急调到另外一个项目组解决线上内存泄漏问题.经过两周的玩命奋战终于解决了这个问题这里把心路历程及思路分享给大家.希望可以帮助到各位或现在正遇到这样事情的小伙伴提供 ...

  8. MAT工具定位分析Java堆内存泄漏问题方法

    一.MAT概述与安装 MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题.该工具提供了两种使用方式,一种是插件版,可以安装到Eclips ...

  9. 并发编程(四):ThreadLocal从源码分析总结到内存泄漏

    一.目录      1.ThreadLocal是什么?有什么用?      2.ThreadLocal源码简要总结?      3.ThreadLocal为什么会导致内存泄漏? 二.ThreadLoc ...

随机推荐

  1. elasticsearch6 学习之并发控制

    环境:elasticsearch6.1.2        kibana6.1.2  并发问题无处不在 一.基于_version 的并发控制 在提交数据前先检查提交数据的version与es中存储的ve ...

  2. iOS 企业账号申请证书和打包ipa

    准备: 299美元的企业账号. 1.登陆苹果开发者中心: https://developer.apple.com .点击Menber Center.输入企业账号和密码登陆. 2.登陆后选择“Certi ...

  3. 【BZOJ1914】数三角形(组合数,极角排序)

    [BZOJ1914]数三角形(组合数,极角排序) 题面 BZOJ权限题 良心洛谷 题解 这种姿势很吼啊,表示计算几何啥的一窍不通来着. 题目就是这样,正难则反,所以我们不考虑过原点的三角形, 反过来, ...

  4. 【BZOJ1835】基站选址(线段树)

    [BZOJ1835]基站选址(线段树) 题面 BZOJ 题解 考虑一个比较暴力的\(dp\) 设\(f[i][j]\)表示建了\(i\)个基站,最后一个的位置是\(j\)的最小代价 考虑如何转移\(f ...

  5. Satisfiability of Equality Equations - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Satisfiability of Equality Equations - LeetCode 注意点 必须要初始化pre 解法 解法一:典型的并查集算法 ...

  6. as, idea 出现 Gradle's dependency cache may be corrupt 错误分析

    问题: Error:Failed to open zip file.Gradle's dependency cache may be corrupt (this sometimes occurs af ...

  7. Android Studio & eclipse 调试技巧

    如上图设置多个断点,开启调试.想跨断点移动到下一个断点,点击如下图1箭头,程序将运行一个断点到下一个断点之间需要执行的代码.如果后面代码没有断点,再次点击该按钮将会执行完程序.点击箭头2指向的按钮,可 ...

  8. 【纪中集训2019.3.12】Mas的仙人掌

    题意: ​ 给出一棵\(n\)个点的树,需要加\(m\)条边,每条边脱落的概率为\(p_{i}\) ,求加入的边在最后形成图中仅在一个简单环上的边数的期望: \(1 \le n \ , m \le 1 ...

  9. BZOJ 2140 稳定婚姻

    2140: 稳定婚姻 Description 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的 ...

  10. 团体程序设计天梯赛 L1-049. 天梯赛座位分配(测试数据+不同方法)

    Data: /*33 2 1#11 4 7 10 13 16 19 22 25 2831 33 35 37 39 41 43 45 47 4951 53 55 57 59 61 63 65 67 69 ...