Это объясняется здесь , что ОАЯ-убийца может быть сконфигурирована с помощью overcommit_memory
и что:
- 2 = без перегрузки. Распределение не удастся, если просить слишком много.
- 0, 1 = перегрузка (эвристически или всегда). Убейте какой-нибудь процесс (ы) на основе некоторой эвристики, когда слишком большой доступ к памяти фактически получен.
Теперь я могу полностью понять это неправильно, но почему нет возможности (или почему это не значение по умолчанию), чтобы убить тот самый процесс, который фактически пытается получить доступ к слишком большому количеству выделенной памяти?
Что если критический системный процесс запрашивает слишком много памяти?
—
Лоуренс
Во-первых, он может сделать это. Но самая большая проблема в этом вопросе состоит в том, что, по всей вероятности, если процесс запрашивает память, то он выполняется заново - или, другими словами, это новый процесс, вовлеченный в очень актуальную обработку. Вы бы предпочли, чтобы OOM позволил вашему не открытому в течение 3 дней im-клиенту тратить системную память впустую, или вы бы предпочли, чтобы YouTube действительно загружался в этом году? linuxatemyram.com
—
mikeserv
Это то, что по
—
Бармар
no overcommit
сути делает опция. Если процесс запрашивает слишком много памяти, он терпит неудачу. Если он проверяет на ошибку, он обычно убивает себя; если этого не произойдет, он, вероятно, получит ошибку сегментации, когда попытается разыменовать malloc()
возвращаемый нулевой указатель , и произойдет сбой.
Обратите внимание, что 2 на самом деле является
—
hans_meine
no overcommit
режимом, согласно цитируемым источникам (таким как kernel.org/doc/Documentation/vm/overcommit-accounting ). Я думаю, что я отредактирую ваш вопрос соответственно.