我在混合模式 C++/CLR .NET 应用程序中遇到内存泄漏缓慢的问题。
(它是链接到带有“/clr”编译器设置的 VS2008 C++/CLR Windows 窗体应用程序的 C++ 原生静态库)
典型行为:应用开始使用 30 MB(私有内存)。然后缓慢地泄漏内存,例如在模拟重负载下运行时每小时 1 MB。这模拟了应用程序运行数天或数周。
我尝试使用多种工具来追踪内存泄漏,包括 Visual Studio CRT 库附带的 CRT 调试工具。我还使用了商业泄漏检测工具(“Memory Validator”)。
两者都报告了在关机时可忽略不计的内存泄漏(我不担心的一些次要条目达到几 KB)。此外,我可以在运行时看到跟踪的内存似乎并没有那么多(所以我不相信它只是被持有的内存并且只在应用程序退出时释放)。我得到了大约 5 MB 的列出内存(总共 > 30 MB)。
该工具(内存验证器)设置为跟踪所有内存使用情况(包括 malloc、new、虚拟内存分配和一大堆其他类型的内存分配)。基本上,已选择要跟踪的内存的每个设置。
.NET 映像报告它正在使用大约 1.5 MB 的内存(来自 perfmon)。
这是最后一点信息:我们有一个作为本机控制台应用程序运行的应用程序版本(纯本机 - 根本不是 CLR)。这与混合模式 95% 相同,但没有 UI 内容。这似乎根本没有泄漏内存,并且在大约 5MB 私有字节时达到峰值。
所以基本上我在这里想要表达的是我不认为任何本机代码正在泄漏内存。
另一个难题:我发现这指的是针对 2.0 框架(我是)时混合模式应用程序中的内存泄漏:http: //support.microsoft.com/kb/961870
不幸的是,细节非常稀疏,所以我不确定它是否相关。我确实尝试过以 3.5 框架而不是 2.0 为目标,但仍然遇到同样的问题(也许我没有做对)。
有人有什么建议吗?
一些可能对我有帮助的事情:
- 有没有我没有跟踪的其他类型的内存分配?
- 为什么数字不加起来?我得到了 5 MB 的 CRT 内存使用量,1.5 MB 的 .NET 内存,那么整个应用程序怎么会使用 30MB 的私有字节呢?这一切都与.NET 框架有关吗?为什么我在泄漏工具中看不到这些?.NET 框架不会显示为某种分配的内存吗?
- 任何其他与混合模式应用程序配合良好的泄漏检测工具?
谢谢你的帮助
约翰