Это объясняется здесь , что ОАЯ-убийца может быть сконфигурирована с помощью overcommit_memory
и что:
- 2 = без перегрузки. Распределение не удастся, если просить слишком много.
- 0, 1 = перегрузка (эвристически или всегда). Убейте какой-нибудь процесс (ы) на основе некоторой эвристики, когда слишком большой доступ к памяти фактически получен.
Теперь я могу полностью понять это неправильно, но почему нет возможности (или почему это не значение по умолчанию), чтобы убить тот самый процесс, который фактически пытается получить доступ к слишком большому количеству выделенной памяти?
linux
out-of-memory
Мартин Ба
источник
источник
no overcommit
сути делает опция. Если процесс запрашивает слишком много памяти, он терпит неудачу. Если он проверяет на ошибку, он обычно убивает себя; если этого не произойдет, он, вероятно, получит ошибку сегментации, когда попытается разыменоватьmalloc()
возвращаемый нулевой указатель , и произойдет сбой.no overcommit
режимом, согласно цитируемым источникам (таким как kernel.org/doc/Documentation/vm/overcommit-accounting ). Я думаю, что я отредактирую ваш вопрос соответственно.Ответы:
Рассмотрим этот сценарий:
Если убитый процесс был последним процессом, который запросил память, ваш диспетчер задач был бы уничтожен.
Или:
Теперь ваш X-сервер убит. Это не вызвало проблемы; это было просто "в неправильном месте в неподходящее время". Это был первый процесс, который выделил больше памяти, когда ничего не осталось, но это был не тот процесс, который использовал всю память для начала.
источник