【发布时间】:2017-12-21 15:15:58
【问题描述】:
有这个代码
class Program
{
private static readonly int[] s_numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
static void Main(string[] args)
{
foreach (int number in s_numbers)
{
WriteLine(number);
}
WriteLine("Press ENTER to close the app.");
ReadLine();
}
}
我想知道s_numbers 数组将被分配到哪里(哪一代)?
我的推理如下 - 因为这是static readonly 成员,所以它不会是nulled,所以在AppDomain 的生命周期内不会是GC'd。因此,直接将其放入 GEN2(如大型对象)而不在 GEN0 中分配它然后将其从 GEN0 移动到 GEN2 是有意义的。
不幸的是,我无法确认是否是这种情况(我无法使用 WinDbg 找到这个数组)。
所以重申一下这个问题 - 这个static readonly 成员将被分配到哪一代 GC 中?
【问题讨论】:
-
只用了一次,优化者可能不这么认为。
-
由于在普通托管堆中分配内存的唯一方法是增加 GEN0 中的高水位标记,您如何建议您的“优化”直接进入 GEN2?
-
@Rob 所以在这种情况下它是 GEN0,如果它会被其他地方使用(通过公共只读属性)怎么办?
-
@Damien_The_Unbeliever 那么它是如何处理大型物体的呢?还是说大对象也先在 GEN0 中分配,最终通过 GC 提升到 GEN2 ?
-
不,大对象有一个专用的堆 (LOH)