当我们谈论 Windows 内存架构时 => 我们谈论的是虚拟内存管理器,它将内存块“提供”给分配应用程序要求的内存大小的应用程序管理器堆。
( http://msdn.microsoft.com/en-us/library/ms810466.aspx )
但是在 .net => 中,.net 托管堆是从虚拟内存管理器“询问”内存(我几乎可以肯定是这种情况)还是 .net 托管堆和虚拟内存管理器之间存在一些层?
(这个问题与GC无关)
当我们谈论 Windows 内存架构时 => 我们谈论的是虚拟内存管理器,它将内存块“提供”给分配应用程序要求的内存大小的应用程序管理器堆。
( http://msdn.microsoft.com/en-us/library/ms810466.aspx )
但是在 .net => 中,.net 托管堆是从虚拟内存管理器“询问”内存(我几乎可以肯定是这种情况)还是 .net 托管堆和虚拟内存管理器之间存在一些层?
(这个问题与GC无关)
.NET 运行时基本上充当托管堆的内存管理器。所以每次你新建一个对象时,它要么推进 gen0 GC 堆上的指针(这可能会触发一个收集),要么在大对象堆上分配一个卡盘。后者类似于常规 CRT 堆,因为它使用空闲列表。
GC 堆本身存储在根据需要分配/释放给操作系统的段中。这意味着托管内存使用通常不会立即反映在进程级别上。
您可以通过 SOS 调试器扩展检查托管堆是如何从不同的段构建的,该扩展可以在 WinDbg 中加载(它也可以在 VS 中加载,但如果你问我,体验有点粗糙)。
我想到了两本书:CLR via C#和Shared Source CLI。他们都在某种程度上涵盖了这一点。