gpt4 book ai didi

c# - mscorwks中的非托管内存泄漏帮助分析

转载 作者:太空狗 更新时间:2023-10-29 21:45:51 30 4
gpt4 key购买 nike

故事:

我们在 .NET 2.0 应用程序中面临非托管内存泄漏。启动后的进程消耗大约 150MB(其中大部分是 .NET 管理的,对象状态等)。大约 12 小时的运行过程消耗了 800MB,接下来的 12 小时过程有大约 1.8GB 的​​ RAM。我刚刚尝试了 JetBrains .NET Memory Profiler、ANTS、.NET Memory Profiler(以及市场上可能提供的 2 个下一个内存配置文件)这些都没有帮助我,因为我后来发现我们的进程在非托管区域消耗了那么多内存。为了检测这一点,我使用了带有计数器的 Perf 监视器:Private Bytes(Process) 和 # Bytes in All Heaps (.NET CLR Memory),其中 Private Bytes 消耗进程分配的所有内存的大约 90%。这就是我切换到非托管调试的原因。

调试诊断:所以我在进程上运行 debugdiag 并获得完整转储,这是它的快照:

  • mscorwks.dll(一个已知的 Windows 内存管理器)负责值(value) 781,73 兆字节的未完成分配。这些分配似乎源自以下模块,并且功能:

  • ntdll.dll(一种已知的 Windows 内存管理器)负责 98.24 MB 的未完成分配。这些分配似乎源自以下模块和功能:

按分配计数排名前 4 的函数

  • mscorwks!EEHeapAlloc+15b -- 80 957 分配
  • mscorwks!CLRMapViewOfFileEx+4a -- 4 171 分配

按分配大小划分的前 4 个函数

  • mscorwks!EEVirtualAlloc+15b -- 117,50 MB
  • mscorwks!EEHeapAlloc+15b -- 15,03 MB

发现有趣的日志:

函数详细信息

函数 mscorwks!EEVirtualAlloc+15b

  • 分配类型虚拟内存分配
  • 分配计数 1471 次分配
  • 分配大小 117,50 MBytes
  • 泄漏概率 73%

函数 mscorwks!EEHeapAlloc+15b

  • 分配类型堆分配
  • 分配计数 80957 次分配
  • 分配大小 15.03 兆字节
  • 泄漏概率 72%

函数 mscorwks!CExecutionEngine::CheckThreadState+fe

  • 分配类型堆分配
  • 堆句柄 0x00000000`00000000
  • 分配计数 2 个分配
  • 分配大小 304 字节
  • 泄漏概率 98%

函数 mscorwks!CLRMapViewOfFileEx+4a

  • 分配类型虚拟内存分配
  • 分配计数 4171 个分配
  • 分配大小 0 字节
  • 泄漏概率 73%

我希望有人能将我推向正确的方向 我怎样才能从这个转储中发现内存泄漏?我能够将转储加载到 windbg 中并运行标准的 windbg 命令集,但我不知道哪一个是能够隔离泄漏的正确命令。

如果有人愿意提供帮助,我可以提供完整转储。

最佳答案

查看转储文件,它似乎确实是托管泄漏,只是不在托管堆上。转储显示托管堆非常小,但加载程序堆为 1 GB。该过程有超过 35000 个动态程序集。我查看了其中的一些,它们似乎是序列化的(XML 和二进制)。看看这个blog post .它描述了一个类似的问题。

关于c# - mscorwks中的非托管内存泄漏帮助分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12726689/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com