Значение значений SIZE и RSS в выводе prstat
-
19-08-2019 - |
Вопрос
Кто-нибудь может дать четкое объяснение значения значений SIZE и RSS, которые мы получаем из prstat в Solaris?
Я написал тестовое приложение C ++, которое выделяет память с помощью new[]
, заполняет ее и освобождает с помощью delete[]
.
Как я понял, значение SIZE должно быть связано с тем, сколько виртуальной памяти было " зарезервировано " процесс, то есть память " malloced " или " newed ".
Эта память не суммируется в значении RSS, если я действительно не использую его (заполняя некоторыми значениями). Но тогда, даже если я освобождаю память, RSS не падает.
Я не понимаю, какую семантику я могу правильно назначить этим двум значениям.
Решение
RSS (AFAIK надежно) представляет, сколько физической памяти использует процесс. Используя распределитель памяти Solaris по умолчанию, освобождение памяти ничего не делает с RSS, поскольку оно просто меняет некоторые указатели и значения, сообщая, что память свободна для повторного использования. Если вы не будете снова использовать эту память, выделяя ее снова, она в конечном итоге будет разбита на страницы и RSS будет сброшен.
Если вы хотите, чтобы освобожденная память возвращалась сразу после освобождения, вы можете использовать распределитель mmap для Solaris следующим образом:
export LD_PRELOAD=libumem.so
export UMEM_OPTIONS=backend=mmap
Другие советы
Размер - это общий размер виртуальной памяти процесса, включая все сопоставленные файлы и устройства, а RSS должен быть размером резидентного набора, но он совершенно ненадежен. следует попытаться получить эту информацию из pmap .
Как правило, после выделения памяти для процесса она никогда не будет возвращена операционной системе. В системах Unix вызов sbrk () используется для расширения адресного пространства процессов, и аналогичного вызова для перехода в другом направлении не существует.