Как вы защищаете себя от чрезмерного потребления памяти, сбивающего ПК? - PullRequest
12 голосов
/ 11 июня 2010

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

Подобные вещи раньше вызывали довольно быстрое прекращение работы программы с ошибкой «нехватки памяти», но в наши дни Windows изо всех сил старается передать эту несуществующую память приложению, и фактически видимо, готов совершить самоубийство. Конечно, не буквально, но он будет так сильно голодать из-за используемой физической оперативной памяти, что даже для запуска диспетчера задач потребуется полчаса подкачки (после того, как запущенное приложение все еще выделяет все больше и больше памяти).

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

У вас есть практический совет, как сделать последствия такой ошибки менее страшными? Возможно, некоторые настройки реестра ограничивают максимальный объем виртуальной памяти, который приложение может выделить? Или какой-нибудь флаг CLR, который ограничит это только для текущего приложения? (Обычно в .NET я делаю это для себя.)

( «Не хватает ОЗУ» и «Покупайте больше ОЗУ» бесполезны - первый я не могу контролировать, а второй я уже сделал.)

Ответы [ 5 ]

8 голосов
/ 11 июня 2010

Вы можете оставить командную строку открытой, когда запускаете рискованное приложение.Затем, если он начинает выходить из-под контроля, вам не нужно ждать загрузки диспетчера задач, просто используйте:

taskkill /F /FI "MEMUSAGE ge 2000000"

Это (теоретически) принудительно уничтожит все, используя более 2 ГБпамять.

Используйте taskkill /?, чтобы получить полный список необходимых параметров.

РЕДАКТИРОВАТЬ: еще лучше, запускать команду как запланированное задание каждые несколько минут.Любой процесс, который начинает взрываться, автоматически удаляется.

7 голосов
/ 11 июня 2010

Есть что-то, что вы можете сделать: ограничить размер рабочего набора вашего процесса.Вставьте это в ваш метод Main ():

#if DEBUG
      Process.GetCurrentProcess().MaxWorkingSet = new IntPtr(256 * 1024 * 1024);
#endif

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

Другие вещи, которые вы можете сделать:

  • Добавьте больше оперативной памяти, нет причин не иметь по крайней мере 3 гигабайта в эти дни.
  • Выполните дефрагментацию файла подкачки.Для этого сначала необходимо выполнить дефрагментацию диска, а затем выполнить дефрагментацию файла подкачки с помощью, скажем, утилиты pagedefrag SysInternals.

Особенно последняя задача обслуживания важна на старых машинах.Фрагментированный файл подкачки может значительно ухудшить поведение подкачки.Обычный на машинах XP, которые никогда не дефрагментировались ранее и имеют небольшой диск, который был заполнен.Фрагментация файла подкачки приводит к большому количеству обращений к дисковой головке, что негативно сказывается на вероятности того, что другой процесс сможет вернуться в оперативную память за разумное время.

4 голосов
/ 11 июня 2010

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

Если вам не нравится такой объем служебной информации, есть некоторая середина: вы можете запустить этот процесс внутри объекта задания с ограничением, установленным для памяти, используемой для этого объекта задания.

1 голос
/ 11 июня 2010

В Windows вы можете управлять атрибутами процесса, используя Объекты заданий

0 голосов
/ 11 июня 2010

В этом случае я обычно использую диспетчер задач, чтобы завершить процесс до того, как машина запустит память. TaskMan работает довольно хорошо, даже несмотря на то, что машина начинает плохо пейджинговать. После этого машина обычно восстанавливается. Более поздние версии Windows (например, 7) обычно обладают большей живучестью в этих ситуациях, чем более ранние версии. Работа без DWM (отключение тем Aero в Vista и 7), как правило, также дает больше времени для вызова задачника для мониторинга и, возможно, для уничтожения неуправляемых процессов.

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