Список 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 бит.