惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
S
SegmentFault 最新的问题
D
DataBreaches.Net
H
Help Net Security
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
Martin Fowler
Martin Fowler
IT之家
IT之家
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
腾讯CDC
罗磊的独立博客
Y
Y Combinator Blog
阮一峰的网络日志
阮一峰的网络日志
云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
WordPress大学
WordPress大学
Microsoft Security Blog
Microsoft Security Blog
J
Java Code Geeks
Vercel News
Vercel News
Hugging Face - Blog
Hugging Face - Blog
aimingoo的专栏
aimingoo的专栏
Stack Overflow Blog
Stack Overflow Blog
Recent Announcements
Recent Announcements
博客园 - 三生石上(FineUI控件)

博客园 - baoli

健壮应用程序异常信息收集,捕捉UnhandledException,并生成dump文件 JProfile使用心得--windows版 一些关于debug和性能分析方面的资料收集 XML技术架构概要介绍 Unix Bourne Shell 注意问题备忘 [转载]socket编程原理 组件设计时支持小结 spring 笔记(java版) 说说网络通信模型 几个网络模型的示例代码(BlockingModel、OverlappedModel、WSAEventSelect、CompletionRoutine)..c++ 发个IOCP的C++例子 [转载]IOCP模型的总结 [转载]理解 I/O Completion Port (IOCP完成端口) [转载]手把手教你玩转SOCKET模型之重叠I/O篇 [转载]Windows网络编程系列教程之四:Select模型 [转载]同步、异步、阻塞和非阻塞的概念 检测MDAC版本的检测器 关于如何判断程序和类库是Debug 还是 Release 的问题 oracle里面对数字的位与或运算
网站内存泄漏问题追踪--初始访问后,三次查询点击内存使用...
baoli · 2008-02-19 · via 博客园 - baoli

网站是使用dotnet1.1开发的项目。类似的问题在windows2000的iis5和windows2003的iis6上也有相同的表现。
具体的现象是在只有一个用户访问的情况下,打开登录页很慢。登录网站后点击里面几个不同的查询功能,没点一次内存就暴增一次。三次点击后内存已经占用了400M以上。
下图是从打开登录页到三次点击的过程。

关注图中Private Bytes(下文简称PB)、Virtual Bytes(下文简称VB)、# Bytes in all Heaps(下文简称BH)三个指标。(Gen 0 heap size、Gen 1 heap size的曲线暂时不要管它)可以看到三个指标的增长关系,PB是在每次点击后增长的比例都很大,而VB每次也有增长,但是增长幅度比PB小很多。BH在整个过程中基本就没有什么增长。因为BH可以看做是托管程序耗用内存的指标,PB是分配给进程私有内存指标,VB是进程的虚拟内存指标。从上图展现它们之间的增长关系可以得出这样一个结论。网站存在某种内存泄漏,因为三次点击从数据库返回的数据并不可能有400M的大小(要是有网速也太高了)。因为BH在整个过程中的增长比例很小,而PB每次都有大比例的增长,所以可以判断内存泄漏的地方不在托管程序,而应该在非托管中。另外对比PB和VB的增长比例,PB的增长比VB明显得多,因此也能基本排除由碎片导致的内存泄漏。
那是什么导致了内存泄漏呢?
用windbg把IIS进程DUMP了出来,查看了托管部分的内存使用,发现确实如性能分析器给出的一样,因此把精力都集中在非托管的检查中。然后检查了进程的HEAP、CallStack、Virtual Memery、Thread、Moudel等占用的内存,也没有发现内存大量占用的情况。那么剩下的可能就是代码使用了VirtualAllocEx分配内存(进程分配内存的方式之一)。
查阅了不少资料,得知Debug Diagnostics Tool能分析VirtualAllocEx分配内存导致内存泄漏的问题。因此使用它重新dump和分析了该网站的iis进程(微軟的居家除蟲包--Debug Diagnostics Tool使用说明)。分析结果如下:

msdatl3.dll is responsible for 361.00 MBytes worth of outstanding allocations. The following are the top 2 memory consuming functions:
msdatl3!CReservedBlockManager::GetBlock+21: 361.00 MBytes worth of outstanding allocations.

Function   msdatl3!CReservedBlockManager::GetBlock+21
Allocation type   Virtual memory allocation(s)
Allocation Count   361 allocation(s)
Allocation Size   361.00 MBytes
Leak Probability   83%

原凶就是这个msdatl3.dll的CReservedBlockManager::GetBlock。每调用一次就分配1M的内存。msdatl3.dll是MDAC(Microsoft Data Access Components)的一个实现文件。

问题的原因找到了,目前还没有找到解决的办法>_<.......待续.....