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

时间:2014-01-28 08:02:53

标签: windbg

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

1 个答案:

答案 0 :(得分:13)

!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:可能使用的内存

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

按用途划分的最大区域:

这里特别重要的是自由区。最大的空闲区域决定了一个块可以获得多少内存。环顾memory fragmentation,了解为什么这可能成为一个问题。

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

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

MSDN: Managing Heap MemoryMSDN: Managing Virtual Memory

上详细了解本机内存管理