Я как себе представляю - malloc не удается, дальше процесс сворачивает манатки, дропает валы и уходит на отдых, а постмастер или кто-то там еще запускают уборку.
Постгрес использует malloc внутри бэкенда для "рабочей" памяти при обработке запроса.
Если malloc возвращает NULL, то просто репортится ошибка:
src/backend/utils/mmgr/mcxt.c:
if (unlikely(ret == NULL))
{
MemoryContextStats(TopMemoryContext);
ereport(ERROR,
(errcode(ERRCODE_OUT_OF_MEMORY),
errmsg("out of memory"),
errdetail("Failed on request of size %zu in memory context \"%s\".",
size, context->name)));
}
После чего абортируется текущая транзакция. И сам постгрес и даже бэкенд продолдают работу.
Размер временной памяти задаётся work_mem параметром, но это не жётское ограничение но "пожелание" посгресу не выходить за эту границу.
Но недостаток памяти в системе может сказаться не только на malloc-е.
И для shared memory может не хватить физической памяти (особенно если выключен свап)
Тогда придёт страшный OOM killer и прибьёт первого попавшегося. Это с большой вероятностью приведёт к перезагрузке всего постгреса.
Справиться с этим на уровне посгреса никак нельзя. Можно пытаться ограничить аппетиты бэкендов и других процессов с помощью квот или cgroups. Ну или иметь достаточный СВАП.
Ну а самое правильное - не запускать такие процессы которые выжрают всю память:)