【问题标题】:Architecture of the .net heap memory.net 堆内存的架构
【发布时间】:2012-05-11 19:18:48
【问题描述】:

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

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

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

(这个问题与GC无关)

【问题讨论】:

    标签: .net memory-management


    【解决方案1】:

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

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

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

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

    【讨论】:

    • +1 用于谈论 SOS。 PSCOR2 和 PSCOR4 也非常适合堆检查。
    • @GregC:他们是。 PSSCOR 本质上是从 SOS 源的一个分支构建的,因此它们共享很多。
    猜你喜欢
    • 2012-01-18
    • 2012-12-05
    • 2012-04-02
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2011-01-05
    相关资源
    最近更新 更多