Resumindo:
-
Tamanho virtual: é a quantidade de espaço de endereço que um processo está gerenciando. O espaço de endereço virtual contém tudo o que o processo pode acessar por meio de ponteiros (referências de endereço de memória). Por exemplo, se o seu programa obtiver acesso ao framebuffer de sua placa de vídeo, essa memória será mapeada para o espaço virtual do processo e receberá um endereço armazenado em um ponteiro. Arquivos mapeados na memória e mapeamentos anônimos também são contabilizados no tamanho do espaço de endereço virtual. Quase tudo está no tamanho virtual. Se você somar o tamanho de todos os intervalos de endereços listados em
/proc/<pid>/maps
, ele deverá retornar aproximadamente o mesmo valor do tamanho virtual. -
Tamanho de residente: é a quantidade de memória que pertence especificamente àquele processo atualmente residente na memória. Isso significa que a quantidade de memória que não está em troca. Observe que partes do processo podem estar na memória de troca, mesmo quando o processo está em execução. O sistema operacional puxará essas regiões da troca quando o processo tentar acessá-las. Isso deve incluir o heap, as pilhas de todos os segmentos e outros mapeamentos particulares. Se você procurar em
/proc/<pid>/maps
, os[stack]
,[heap]
e outros mapeamentos anônimos (aqueles sem caminhos de arquivo) serão trocados ou contabilizados no tamanho residente. -
Tamanho compartilhado: é a quantidade de memória que pode pertencer a vários processos. Por exemplo, se você tiver quatro instâncias do mesmo aplicativo carregadas na memória, você terá quatro instâncias do heap e pelo menos quatro pilhas, uma para cada processo (essa é a memória residente), mas você terá apenas uma instância de o código binário do programa e suas bibliotecas. Este é o espaço compartilhado. Não só inclui o código binário do programa e suas bibliotecas, mas também arquivos de localização, dados do programa somente leitura, segmentos de memória compartilhada SysV e POSIX, semáforos, etc ... Se você olhar em
/proc/<pid>/maps
, a maioria dos mapeamentos é vinculada à biblioteca e os arquivos de programa são compartilhados.
Observe que o VIRT contém a união de RSS e SHR e sempre será maior que qualquer um deles. Pode haver regiões contabilizadas como RSS e SHR.