CLR中的托管堆

时间:2012-10-30 14:22:04

标签: c# memory-management .net-4.0 clr

我在.NET中读到了CLR:

当CLR加载堆时,在SOH和LOH中进行分区。

  1. 当应用程序启动时,CLR会根据应用程序的大小将堆分配给应用程序。

  2. LOH堆有Gen0,Gen1和Gen2区域。

  3. 此处A类的所有对象都在Gen0上分配,

    问题

    1. CLR如何知道堆中的应用程序将占用的大小?
    2. 假设CLR为 Gen0 区域分配了4K堆内存。鉴于下面的代码,这个单线程是否可以在Gen0上使用完整的4K内存?

      collect = new List();
      while(true)
      {
          collect.Add(new A());
          new A();
          new A();
      }
      
      class A
      {
          int a = 0, b = 0;
      }
      

1 个答案:

答案 0 :(得分:1)

  1. 我相信这是通过计算所有声明的字段的大小来确定的。有关更多详细信息,请参阅MSDN "Allocating Memory"
  2. 关于MSDN论文"Automatic Memory Management"所有新对象(如以下评论中提到的Brian Rasmussen - 代数仅适用于SOH,LOH中创建的大型对象不是代际healp)最初在{{1}中创建只有那些在应用程序生命周期中幸存的人才会被移到Gen0。但有人提到,如果Gen1已满,GC会执行垃圾收集以清理Gen0,如果它仍然已满,则所有新对象都将在Gen0中创建。