C# – 是否可以迭代GC堆?

我不确定以下问题是否有效。为了教育自己,我只是在问。

(1)我可以以编程方式迭代所有代的GC堆吗?

(2)是否可以通过启动线程来观察GC如何对我的组件进行操作?

你的问题的答案是:

  1. 不幸的是,你不能。 CLR的垃圾收集器以标记,扫描,紧凑模式工作,因此在运行之间没有关于堆的信息(除了堆的大小或特定类型实例的当前生成),这将允许您迭代所有对象它。

  2. 监视GC的最佳方法是使用perfmon并观察(或记录) CLR内存计数器 。

我刚才在网上搜索同一问题的答案,但我没有找到任何方法以编程方式迭代GC堆。

如果您只是需要查看此信息以进行调试,则可以启动WinDbg并加载SOS扩展。 您可以使用!dumpheap extension命令查看GC堆上的确切对象。 如果有的话,你也可以使用dotTrace的内存分析模式。