Существует много информации о .NET LOH, и это объясняется в различных статьях. Тем не менее, кажется, что в некоторых статьях не хватает точности.
Устаревшая информация
В Брайан Расмуссен отвечает (2009), менеджер программ в Microsoft, он говорит, что предел составляет 85000 байт. Он также сообщил нам, что существует еще более любопытный случай double[]
с размером 1000 элементов. Тот же предел в 85000 указан Маони Стивенс (MSDN, 2008), член команды CLR.
В комментариях Брайан Расмуссен становится еще точнее и дайте нам знать, что его можно воспроизвести с помощью byte[]
из 85000 байт - 12 байт.
Обновление 2013 года
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[]
. Brute-forcing дает мне 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-фреймворков. Это также не зависит от сборки Release или Debug.
Как объяснить изменения?