如何分析.NET进程的非托管堆大小

mku*_*kus 5 windbg

如何使用Windbg分析.NET进程的非托管堆大小?在WinDbg中应该使用哪些命令?

Tho*_*ler 14

!address -summary 给你一个概述,不关注个人堆.

使用摘要包含以下内容:

  • 免费:可以分配和使用的空闲内存
  • 图像:EXE和DLL文件使用的内存
  • MappedFile:内存映射文件使用的内存
  • Heap/Heap32/Heap64:通过堆管理器分配的内存
  • Stack/Stack32/Stack 64:线程堆栈使用的内存
  • TEB/TEB32/TEB64:线程环境块使用的内存
  • PEB/PEB32/PEB64:进程环境块使用的内存(例如命令行和环境变量)

类型摘要包含:

  • MEM_IMAGE:应大致对应Image
  • MEM_MAPPED:应大致对应MappedFile
  • MEM_PRIVATE:私有内存,只能由您的应用程序使用而不能共享

州摘要:

  • MEM_FREE:应该大致对应Free
  • MEM_COMMIT:正在使用的内存
  • MEM_RESERVE:可能使用的内存

保护摘要应该解释自己.如果你是新手,那可能不是那么有趣.

最大区域按用途:

这里特别重要的是自由区.最大的空闲区域决定了一个块可以获得多少内存.查看内存碎片,找出原因可能是一个问题.

!heap -s 为您提供关于堆的摘要,重点关注单个堆.

这些都是通过Windows堆管理器完成的本机内存分配.未列出通过VirtualAlloc()的直接分配(例如MSXML和.NET).

阅读有关MSDN上本机内存管理的更多信息:管理堆内存MSDN:管理虚拟内存