症状:
上次一站点发布后,发现服务器内存持续上涨。正常本地缓存占了4-5个G ,使用内存直接涨到20G后应用程序池重启。
检查代码后发现,没有什么内存泄漏的地方。最后还是找来DUMP文件排查原因。
!dumpheap –stat 查看当前所有托管类型的统计信息
System.Threading.ReaderWriterCount 占了七个G。这是个读写锁, 有一亿多个对象。
!dumpheap –mt 000007fef32fa770 查看函数表地址中的各个对象信息
然后查看其中一个对象
!gcroot 0xooooooo1f27e03b8 查找对象的根,需要很久的时间
这个是ReaderWriterLockSlim 的内部对象。
继续查找ReaderWriterLockSlim的根
!gcroot 00000001d09379d8
这是用引用框架DLL 内部的方法。
应该是什么原因造成创建了大量ReaderWriterLockSlim对象又没有释放。
找到原代码后发现,是由于注册了一个HttpModule 对每个不重复的访问目录进行记录,这个过程会对每个目录分配一个读写锁。
正好,上次另一个客端的更新,每次访问都加上随机后缀目录。造成大量的读写锁。
禁掉DLL 的这个功能后,问题解决。
Windbg 分析内存上涨
时间: 2024-10-16 22:11:36