您能否指出一些书籍或网站,详细介绍(深入).Net Framework(例如 4.0 及更高版本)的 CLR 和垃圾收集器中使用的底层机制和接口?
我最终试图学习如何让垃圾收集器在与包含该项目的非托管列表对话时认为它已被标记,并且觉得在获得远程成功之前我可能需要学习一些知识。
我读过的关于内部的最佳文章之一是MSDN 杂志 2005 年 5 月期 - JIT 和运行 - 深入了解 .NET Framework 内部以了解 CLR 如何创建运行时对象。
了解内部原理的好书是 Jeffery Richter 的CLR Via C#。
虽然它停留在 v2.0 运行时内部,但SSCLI(例如转子)仍然与理解 .Net 4.x 内部非常相关。虽然它与生产运行时之间存在差异,但许多概念是相同的。
不过,4.0 和 4.5 中的 GC 确实已经发展,其中一位工程师Maoni Stephens让我们及时了解更新,包括后台并发和持续的低延迟。
就您的具体需求而言,实际上只有两种情况:您正在使用 PInvoke 服务,在这种情况下,您无需担心 GC 从本机端影响您的托管对象,因为 PInvoke 会为您,以及您必须明确地将对象固定在 GC 堆上的情况,否则它可能会在用于非托管代码时移动或被收集。为此,您可以使用 C#fixed
或 C++/CLIpin_ptr
或使用GCHandle。
Pro .NET Performance
来自 Sasha Goldshtein 的一章专门介绍垃圾收集器。他以非常详细和准确的信息涵盖了该主题。
正如其他人CLR via C#
从 Jeffrey Richter 那里提到的那样 - 最近发布了第四版(更新为 4.5,尽管 GC 部分没有发生太大变化),我也可以向您推荐。
msdn 文档始终是一个很好的信息来源。