Хороший пример для тех, кто путает virtual memory и реальное потребление памяти в Linux.
Когда процесс делает
mmap, он может зарезервировать большой кусок виртуального адресного пространства, например 1 GB. Но это ещё не значит, что процесс реально занял 1 GB физической памяти.Физические страницы появляются только тогда, когда программа реально к ним обращается:
-
mmap создаёт отображение в адресном пространстве- запись в
region[0] или region[4096] заставляет ядро выделить физические страницы- RSS растёт, потому что теперь за частью адресов стоит реальная память
-
madvise(..., MADV_DONTNEED) говорит ядру: эти страницы больше не нужны- Linux может освободить физическую память
- само виртуальное отображение при этом остаётся
Именно поэтому после
MADV_DONTNEED RSS падает, но virtual memory почти не меняется. Адреса всё ещё зарезервированы, просто за ними больше нет физических страниц.А если потом снова записать в
region[0], произойдёт page fault, и Linux заново подложит физическую страницу по требованию.Редкий, но важный момент для backend, runtime, баз данных и всего, где память измеряется не глазами в
top, а пониманием того, что именно показывает метрика.
