如何在.Net中列出堆中的所有托管对象?

Posted

技术标签:

【中文标题】如何在.Net中列出堆中的所有托管对象?【英文标题】:How to list all managed objects in heap in .Net? 【发布时间】:2011-02-25 10:30:07 【问题描述】:

是否可以列出存储在堆中的所有对象。 我想做这样的事情:

IEnumerable<GCHandle> listOfObjectsInHeap = GetListOfObjectsFromHeap();

【问题讨论】:

为什么要这样做?你想用这些信息做什么? 【参考方案1】:

我不知道有任何托管函数允许您执行此操作。您可以使用HeapWalk 函数检索此信息。 Here's an example 使用它(它会创建一个新堆,但您可以使用 GetProcessHeap 检索当前进程堆)。

【讨论】:

【参考方案2】:

您可以使用Profiling API 来实现此目的。不幸的是不在托管代码中。

【讨论】:

【参考方案3】:

使用 ClrMD 库,您可以连接到自己的进程并检查堆。

但是,众所周知,对正在运行的进程使用 ClrMD 会限制可用信息,因为堆可能会在您尝试遍历它时发生变化。

http://blogs.msdn.com/b/dotnet/archive/2013/05/01/net-crash-dump-and-live-process-inspection.aspx

【讨论】:

这是最好的办法。 链接现在是“禁止访问”

以上是关于如何在.Net中列出堆中的所有托管对象?的主要内容,如果未能解决你的问题,请参考以下文章

值类型数组如何存储在 .NET 对象堆中?

《精通C#》第十三章 对象的生命周期

Windows 运行时中的内存管理

利用IDisposable接口构建包含非托管资源对象

如何把 .NET 进程中的所有托管异常找出来?

.net中的托管资源和非托管资源