【发布时间】:2010-11-08 12:36:57
【问题描述】:
我在混合模式 C++/CLR .NET 应用程序中遇到缓慢的内存泄漏问题。
(它是使用“/clr”编译器设置链接到 VS2008 C++/CLR Windows 窗体应用程序的 C++ 原生静态库)
典型行为:应用开始使用 30 MB(私有内存)。然后缓慢地泄漏内存,例如在模拟重负载下运行时每小时 1 MB。这会模拟应用运行数天或数周。
我尝试使用多种工具来追踪内存泄漏,包括 Visual Studio CRT 库附带的 CRT 调试工具。我还使用了商业泄漏检测工具(“Memory Validator”)。
两者都报告了在关机时可忽略不计的内存泄漏(我不担心的几个小条目,总计几 KB)。此外,我可以在运行时看到跟踪的内存似乎并没有那么多(所以我不相信它只是被持有的内存并且只在应用程序退出时释放)。我获得了大约 5 MB 的列出内存(总共 > 30 MB)。
该工具(Memory Validator)用于跟踪所有内存使用情况(包括 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 框架不会显示为某种分配的内存吗?
- 任何其他泄漏检测工具可以很好地与混合模式应用程序配合使用?
感谢您的帮助
约翰
【问题讨论】:
-
.NET 2.0 和 .NET 3.5 都使用相同的 CLR 2.0,您可以从版本号中轻松看出 ;-)
标签: .net c++ memory-leaks mixed-mode