Pode ser possível que seu programa tenha usado memória compartilhada e não tenha limpado isso.
Existem três variantes de memória compartilhada no linux:
1.) A memória compartilhada POSIX (aquela implementada pela glibc) é acessível por meio de arquivos no pseudo-sistema de arquivos tmpfs
e geralmente é montada pelo sistema em locais como /dev/shm
, /run
, /run/shm
ou %código%. A melhor maneira de descobrir com certeza é inserir /run/lock
(mais portátil) ou mount | grep -E '^tmpfs'
(melhor para o Linux) em um shell.
Observe que é possível para um processo chamar grep -E '^tmpfs' /proc/mounts
em um arquivo unlink()
'ed na memória compartilhada, tornando o arquivo inacessível por meio do nome do arquivo (por exemplo, é necessário um identificador de arquivo previamente alocado para continuar acessando-o). No entanto, mmap()
ed arquivos são geralmente excluídos ao sair de todos os processos que tinham unlink()
'ed - talvez se o seu programa terminar, ainda há outro processo ainda segurando um identificador para ele.
2.) Memória compartilhada SysV IPC, que não é visível através do pseudo-sistema de arquivos open()
, mas via tmpfs
, syscalls do Linux (somente se você for um hacker), seu wrapper libc ou, mais recentemente via /proc/sysvipc/shm
. Você precisa encontrar um ID de processo correspondente em qualquer uma dessas listas e, em seguida, inspecionar esse processo ainda mais.
3.) Memória compartilhada mapeada anônima, em cujo caso a memória não é suportada por nenhum arquivo, mas sim a memória é inicialmente compartilhada entre um processo e todos os seus filhos. AFAIK essa memória compartilhada mapeada anônima é liberada quando o processo que ipcs -m -p -[tclu]
'ed it mmap()
s. Então, caso o seu programa tenha terminado e todos os seus processos filhos também tenham funcionado, eles não devem mais ocupar a memória.