Конкретно по линуксам:
1) Программа выдаёт запрос на выделение дополнительной памяти
2) Операционная система проверяет, может ли она выделить эту память.
3) Если память доступна, она выделяется и положительный ответ возвращается программе.
Тонкость на этом этапе: на самом деле памяти может и не быть достаточно. Физически память пока не занимается.
4) Программа записывает данные в выделенную память. Именно на этом этапе может кончиться свободная память.
5) Операционная система обрабатывает состояние ООМ (out of memory). Для начала она пытается освободить память такими "бескровными" действиями, как сокращение размера файлового кэша, буферов ввода-вывода, вытеснением неактивных страниц в раздел/файл подкачки и т.п.
6) Если "бескровно" память высвободить не удалось, вызывается OOM Killer - "судья", который принудительно завершает один из работающих процессов (руководствуясь несколькими критериями), пока состояние ООМ не будет преодолено. У вызвавшей ОММ состояние программы шансы быть пристреленной выше, чем у других.
Подробнее:
https://habrahabr.ru/company/yandex/blog/250753/
https://www.insight-it.ru/linux/2015/chto-stoit-zn...