.net net堆内存的体系结构

.net net堆内存的体系结构,.net,memory-management,.net,Memory Management,当我们谈论windows内存体系结构=>时,我们谈论的是虚拟内存管理器,它将内存块“给予”应用程序管理器堆,该堆分配应用程序请求的内存大小 () 但是在.net=>中,.net托管堆是从虚拟内存管理器“询问”内存(我几乎可以肯定是这样),还是在.net托管堆和虚拟内存管理器之间存在某一层 (这个问题与GC无关)NET运行时基本上充当托管堆的内存管理器。因此,每次新建对象时,它要么在gen0 GC堆上前进指针(这可能会触发一个集合),要么在大型对象堆上分配一个chuck。后者类似于常规CRT堆,因

当我们谈论windows内存体系结构=>时,我们谈论的是虚拟内存管理器,它将内存块“给予”应用程序管理器堆,该堆分配应用程序请求的内存大小

()

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


(这个问题与GC无关)

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

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

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


我想到两本书:和。它们都在一定程度上涵盖了这一点

+1用于谈论SOS。PSCOR2和PSCOR4对于堆检查也非常好。@GregC:它们是。PSSCOR基本上是从SOS源的一个分支构建的,所以它们共享很多。