---- Editado para fornecer exemplo, pois o ponto não está aparecendo ----
Um processo é iniciado e pede 1 GB de memória.
Esse processo então inicia oito threads (todos com acesso à memória alocada de 1 GB).
Alguém executa uma ferramenta para determinar quanta memória está sendo usada. A ferramenta funciona da seguinte forma:
- Encontre todos os itens agendáveis (cada thread).
- Veja quanta memória ele pode acessar.
- Adicione essa memória em conjunto
- Denunciar a soma.
A ferramenta relatará que o processo está usando 9 GB de memória, quando é óbvio que existem oito threads gerados (e o thread para o processo original) todos usando o mesmo GB de memória.
É um defeito em como algumas ferramentas relatam memória; no entanto, não é um defeito facilmente consertável (como consertar isso, seria necessário alterar a saída de algumas ferramentas muito antigas (mas importantes)). Eu não quero ser o cara que reescreve top ou ps, isso tornaria o SO não POSIX.
---- O post original segue ---- Algumas versões de ferramentas de relatório de memória (como o top) confundem, erroneamente, os threads (que têm acesso à mesma memória) aos processos. Como resultado, uma instância do tomcat que gera cinco threads não informa o consumo de memória em cinco vezes.
A única maneira de garantir é listar os processos com seu consumo de memória individualmente e, em seguida, ler a memória de um dos encadeamentos (que está sendo listado como um processo). Dessa forma, você sabe o verdadeiro consumo de memória do aplicativo. Se você confiar em ferramentas que fazem a adição para você, você irá superestimar a quantidade de memória realmente usada pelo número de threads referenciando a mesma memória compartilhada.
Eu tive caixas com 2 GB de memória (e 1 GB de swap) informando que ~ 7 GB de memória estava em uso em um aplicativo particularmente pesado antes.
Para entender melhor como a memória é relatada por muitas ferramentas, procure aqui . Se o código python estiver analisando o texto de uma dessas ferramentas ou obtendo os dados das mesmas chamadas de sistema, estará sujeito aos mesmos erros na memória de relatórios.