2

我在 .NET 中读到了关于 CLR 的内容:

当 CLR 加载时,堆被划分为 SOH 和 LOH。

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

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

这里 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;
    }
    
4

1 回答 1

1
  1. 我相信这是通过计算所有声明字段的大小来确定的,考虑到它的类型。有关更多详细信息,请参阅 MSDN “分配内存”
  2. 关于 MSDN 论文“自动内存管理”所有新对象(正如Brian Rasmussen在下面的评论中指出的那样 - 世代仅适用于 SOH,在 LOH 中创建的大对象不是世代修复)最初创建的Gen0并且只有那些在应用程序生命周期内存活的对象才会被搬到Gen1. 但有人提到,如果Gen0是满的——GC 会执行垃圾收集来清理Gen0,如果它仍然是满的——所有的新对象都将在Gen1.
于 2012-10-30T14:37:49.183 回答