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