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个字节的长字符