Почему я не могу создать объект размером более 2 ГБ в .NET, даже в x64? - PullRequest
1 голос
/ 25 июня 2010

После прочтения Ограничены ли строки C # (и другие .NET API) размером 2 ГБ? Я поиграл с большими строками и массивами в .NET 3.5. Я обнаружил, что самый большой массив, который я мог выделить, был int.MaxValue - 56 байтов. То же самое и со строками: самое большое, что я мог получить, было (int.MaxValue - 58) / 2 символа (поскольку каждый символ занимал 2 байта). После этого он выбрасывает OutOfMemoryException.

Почему существует это ограничение? Не то, чтобы я когда-либо сталкивался с ним на практике - мне просто любопытно узнать о внутренней работе .NET.

Да, это было на 64-битной машине с большим количеством оперативной памяти, конечно - и да, процесс работал как 64-битный процесс. (Я мог бы на самом деле выделить 3 таких массива или строки для общего использования памяти 6 ГБ.)

Ответы [ 2 ]

1 голос
/ 26 июня 2012

В версиях .NET до 4.5 максимальный размер объекта составляет 2 ГБ.Начиная с версии 4.5, вы можете выделять более крупные объекты, если gcAllowVeryLargeObjects включен.Обратите внимание, что ограничение для string не затрагивается, но «массивы» должны также охватывать «списки», поскольку списки поддерживаются массивами.

1 голос
/ 25 июня 2010

Это было дизайнерское решение ограничить размер объекта в куче ГХ до 2 ГБ, даже на x64.Хороший пост в блоге об этом здесь от одного из тех, кто принимал участие в принятии решения о дизайне:

...