Очистить память CLR - PullRequest
       5

Очистить память CLR

1 голос
/ 26 ноября 2009

Я столкнулся с проблемой, когда инструмент, который я использую для разработки (инструмент симулятора), продолжает выдавать исключение OutofMemoryException, я знаю, что это не мое приложение, потому что независимо от того, какой проект я запускаю, это происходит.

Единственное исправление, которое у меня есть для этого, - это перезагрузить мой компьютер, есть ли способ очистить / очистить среду выполнения CLR, чтобы мне не приходилось перезагружать мой компьютер каждый раз, когда это происходит?

Ответы [ 4 ]

1 голос
/ 26 ноября 2009

Каждый процесс, который запускает управляемый код, запускает отдельную копию среды выполнения CLR - и, когда процесс любого типа завершается, используемая им память возвращается в общий пул.

Нет ничего общего для "flush" или "clear".

Возможно ли, что ваш инструмент симулятора не ломается "полностью" - что процесс застревает в неисправном состоянии?

1 голос
/ 26 ноября 2009

Звучит так, будто это сторонний инструмент. Так что я бы подал запрос об ошибке с ними.

Но, как уже говорили другие, проблема будет заключена в процессе операционной системы. Используя диспетчер задач, вы должны быть в состоянии идентифицировать нарушающий процесс и уничтожить его. Это восстановит память и сотрет шифер. Затем вам придется перезапустить симуляцию.

Если эта проблема не позволяет вам завершить симуляцию, я бы отправил срочную (но не сердитую) просьбу об ошибке.

0 голосов
/ 10 сентября 2012

Процесс x86 / 32-битный пользовательский режим в Windows имеет только адресуемую виртуальную память объемом 2 ГБ. 64-разрядный процесс x64 / 64 имеет адресуемую виртуальную память 16 ТБ. Вы не сказали, был ли ваш процесс 32- или 64-битным, но я предполагаю, что 32-битный. Как только 32-разрядный процесс начинает выходить в область виртуальной или выделенной памяти объемом 1,5+ ГБ, в которую вы играете с огнем, и это вопрос времени, когда приложение вылетает. Нет точного и быстрого числа, когда оно рухнет, поскольку каждое приложение отличается.

Итак, давайте поговорим о «2 ГБ» адресуемого пространства ... память, используемая вашим приложением , НЕ имеет доступа ко всем 2 ГБ памяти. Существует много служебных данных, используемых CLR для запуска приложения:

  1. 8 различных куч для приложения .NET - см. Мой ответ на Использование памяти процессом .NET = 5x Память кучи CLR?
  2. Издержки ядра для запуска процесса пользовательского режима
  3. Тема
  4. и т.д.

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

Я разместил довольно много ответов и информации о памяти CLR здесь, в StackOverflow, описывающей, как многое из этого работает. Ищите мое имя и проверьте некоторые другие ответы. Это может помочь немного прояснить ситуацию.

НТН

0 голосов
/ 26 ноября 2009

Исключения OutOfMemoryException не обязательно указывают на проблему со временем выполнения. Это может произойти всякий раз, когда вашей системе не хватает памяти, независимо от того, что она потребляет.

Посмотрите на список процессов в диспетчере задач и посмотрите, что потребляет больше всего памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...