有可用的很多信息有关.NET LOH,它已在各种文章中说明。 然而,似乎有些文章缺乏一点精度。
过时的信息
在布莱恩·拉斯穆森的回答(2009年),项目经理在微软 ,他说,限制为85000个字节。 他还让我们知道我们有一个更奇怪的情况下double[]
的尺寸1000个的元素。 同样的85000限制由规定的猫腻斯蒂芬斯(MSDN,2008年),在CLR团队的一员 。
在评论,布莱恩·拉斯穆森变得更加准确,让我们知道,它可以与再现byte[]
的85000个字节- 12个字节。
2013更新
马里奥·赫沃特(“高级Windows调试”的作者)告诉我们,在2013年的。NET 4.5.1现在可以压缩LOH为好,如果我们告诉它这样做。 因为它是默认关闭的,问题依然存在,除非你意识到这一点了。
2015年更新
我不能再现byte[]
例如任何更多。 具有短的蛮力算法,我发现我必须减去24代替( byte[84999-24]
在SOH, byte[85000-24]
在LOH):
static void Main(string[] args)
{
int diff = 0;
int generation = 3;
while (generation > 0)
{
diff++;
byte[] large = new byte[85000-diff];
generation = GC.GetGeneration(large);
}
Console.WriteLine(diff);
}
我也无法重现的double[]
声明。 暴力破解给了我10622元为界( double[10621]
在SOH, double[10622]
在LOH):
static void Main(string[] args)
{
int size = 85000;
int step = 85000/2;
while (step>0)
{
double[] d = new double[size];
int generation = GC.GetGeneration(d);
size += (generation>0)?-step:step;
step /= 2;
}
Console.WriteLine(size);
}
出现这种情况,即使我编译应用程序为老年.NET框架。 它也并不依赖于发行或调试版本。
如何在变化来解释?