3

当我们谈论 Windows 内存架构时 => 我们谈论的是虚拟内存管理器,它将内存块“提供”给分配应用程序要求的内存大小的应用程序管理器堆。

( http://msdn.microsoft.com/en-us/library/ms810466.aspx )

但是在 .net => 中,.net 托管堆是从虚拟内存管理器“询问”内存(我几乎可以肯定是这种情况)还是 .net 托管堆和虚拟内存管理器之间存在一些层?

(这个问题与GC无关)

4

1 回答 1

3

.NET 运行时基本上充当托管堆的内存管理器。所以每次你新建一个对象时,它要么推进 gen0 GC 堆上的指针(这可能会触发一个收集),要么在大对象堆上分配一个卡盘。后者类似于常规 CRT 堆,因为它使用空闲列表。

GC 堆本身存储在根据需要分配/释放给操作系统的段中。这意味着托管内存使用通常不会立即反映在进程级别上。

您可以通过 SOS 调试器扩展检查托管堆是如何从不同的段构建的,该扩展可以在 WinDbg 中加载(它也可以在 VS 中加载,但如果你问我,体验有点粗糙)。

我想到了两本书:CLR via C#Shared Source CLI。他们都在某种程度上涵盖了这一点。

于 2012-05-11T21:30:26.033 回答