Как уменьшить количество загружаемых библиотек при отладке в Visual C # 2008 Express Edition?
При запуске визуального проекта C # в отладчике я получаю исключение OutOfMemoryException из-за фрагментации виртуального адресного пространства 2 ГБ, и мы предполагаем, что причиной фрагментации могут быть загруженные библиотеки.
Брайан Расмуссен, ты сделал мой день! :)
Его предложение "отключить хостинг Visual Studio" решило проблему.
(подробнее см. Историю развития вопроса ниже)
Привет,
Мне нужно, чтобы два больших массива int были загружены в память с ~ 120 миллионами элементов (~ 470 МБ) каждый, и оба в одном проекте Visual C #.
Когда я пытаюсь создать экземпляр второго массива, я получаю исключение OutOfMemoryException.
У меня достаточно полной свободной памяти, и после выполнения веб-поиска я подумал, что моя проблема в том, что в моей системе недостаточно больших смежных блоков свободной памяти.
НО! - когда я создаю экземпляр только одного из массивов в одном экземпляре Visual C #, а затем открываю другой экземпляр Visual C #, второй экземпляр может создать массив размером 470 МБ.
(Изменить для пояснения: в приведенном выше абзаце я имел в виду запуск его в отладчике Visual C #)
И диспетчер задач показывает соответствующее увеличение использования памяти, как и следовало ожидать.
Так что недостаточно смежных блоков памяти во всей системе не проблема. Затем я попытался запустить скомпилированный исполняемый файл, который создает экземпляры обоих массивов, который также работает (использование памяти 1 ГБ)
Резюме:
OutOfMemoryException в Visual C # с использованием двух больших массивов int, но при запуске скомпилированных exe-работ (с использованием mem 1 ГБ) и двух отдельных экземпляров Visual C # могут найти два достаточно больших непрерывных блока памяти для моих больших массивов, но мне нужен один Visual C # экземпляр, чтобы иметь возможность предоставить память.
Обновление:
Прежде всего, особая благодарность nobugz и Брайану Расмуссену, я думаю, что они точно придерживаются своего прогноза, что «Фрагментация виртуального адресного пространства 2 ГБ процесса» является проблемой.
Следуя их советам, я использовал VMMap и listdlls для своего короткого любительского анализа и получаю:
* 21 dll, указанный для "автономного" -exe. (тот, который работает и использует 1 ГБ памяти.)
* 58 dll перечислены для vshost.exe-версии. (версия, которая запускается при отладке и которая генерирует исключение и использует только 500 МБ)
VMMap показал мне самые большие свободные блоки памяти для версии отладчика: 262,175,167,155,108 МБ.
Итак, VMMap говорит, что нет непрерывных 500 МБ блоков, и согласно информации о свободных блоках, я добавил ~ 9 меньших int-массивов, которые добавили более 1,2 ГБ памяти и фактически работали.
Исходя из этого, я бы сказал, что мы можем назвать «фрагментацию виртуального адресного пространства 2 ГБ» виновной.
Из listdll-output я создал небольшую электронную таблицу с шестнадцатеричными числами, преобразованными в десятичные, чтобы проверить свободные области между dll, и я нашел большое свободное пространство для автономной версии в dll (21), но не для vshost-debugger- версия (58 dlls). Я не утверждаю, что между ними не может быть ничего другого, и я не совсем уверен, имеет ли смысл то, что я там делаю, но это согласуется с анализом VMMaps и кажется, что одни dll уже фрагментируют память для версия отладчика.
Так что, возможно, решение было бы, если бы я мог уменьшить количество DLL, используемых отладчиком.
1. Возможно ли это?
2. Если да, то как бы я это сделал?