Подтвердить что ты не робот

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

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

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

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

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

( "Не запускайте ОЗУ" и "Купить больше ОЗУ" бесполезно - первое, с чем я не контролирую, и последнее, что я уже сделал).

4b9b3361

Ответ 1

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

taskkill /F /FI "MEMUSAGE ge 2000000"

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

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

EDIT: Еще лучше, запустите команду как запланированную задачу каждые несколько минут. Любой процесс, который начинает взорваться, автоматически закроется.

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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