Список C# из исключения памяти, но далеко от предела 2Gb

у меня есть List<Matrix4>, где Matrix4 - это структура, содержащая 16 поплавков, поэтому она использует 16 * 4 байта = 64 байта.

когда я начинаю добавлять элементы в список, он выдает исключение из памяти, когда я пересекаю 1 миллион строк.

Я знаю, что .NET имеет предел 2 Гб на объект, но если я полностью не в своем уме:

1.000.000 * 64 байт = ~61mb

который даже не близок к пределу.

когда я начну заполнять список, согласно диспетчеру задач, мое приложение использует 896mb, и к тому времени, когда я достигаю исключения, он использует 1028mb.

компьютер имеет 8 ГБ физической памяти, но он использует только 6 ГБ.

любой подсказки о том, почему это может происходить?

--- обновление ----

изменение целевой платформы на x64 решило проблему в отдельном тестовом проекте. К сожалению, исходный проект не может быть x64 из-за ссылок на x86 DLL, которые не работают на x64. Но это еще одна проблема.

Я не думал об изменении его на x64, потому что он, казалось, был далек от пределов памяти, но я думаю, что Ханс Пассант был прав на 122mb, слишком близко от предела 1.3 Gb. Спасибо всем.

1 ответов


большие структуры выполняются на большой куче объектов (LOH), и это подлежит фрагментации.

поэтому, хотя у вас, вероятно, достаточно свободной памяти, у вас может не быть 1 достаточно большого блока памяти.

ваши номера (1M x 64) недостаточно сами по себе, только с достаточным количеством других распределений это объяснило бы проблему. Вы можете попытаться решить эту конкретную проблему, но это, вероятно, просто точка, где становится видимой большая проблема.

В общем, TaskManager не является правильным инструментом для диагностики проблем с памятью. Вам нужен профилировщик памяти, чтобы узнать, что происходит.

Это также зависит от версии вашей платформы и от того, является ли она 32 или 64 бит.