Вопрос

Кто-нибудь может дать четкое объяснение значения значений 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 () используется для расширения адресного пространства процессов, и аналогичного вызова для перехода в другом направлении не существует.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top