Как Вы защищаете себя от безудержного потребления памяти, снижающего ПК?

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

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

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

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

("Не исчерпывают RAM", и "Покупают больше RAM", бесполезны - первый я не имею никакого контроля и последнего, которого я уже сделал.)

12
задан Tim Williscroft 31 August 2010 в 03:18
поделиться

5 ответов

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

taskkill /F /FI "MEMUSAGE ge 2000000"

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

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

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

8
ответ дан 2 December 2019 в 18:18
поделиться

В Windows вы можете управлять атрибутами процесса с помощью Job Objects

1
ответ дан 2 December 2019 в 18:18
поделиться

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

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

4
ответ дан 2 December 2019 в 18:18
поделиться

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

0
ответ дан 2 December 2019 в 18:18
поделиться

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

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

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

Вы также можете сделать следующее:

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

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

7
ответ дан 2 December 2019 в 18:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: