A resposta curta para essa pergunta é que nenhum desses valores é um indicador confiável de quanta memória um executável está realmente usando, e nenhum deles é realmente apropriado para depurar um vazamento de memória.
Bytes privados referem-se à quantidade de memória que o processo executável solicitou - não necessariamente à quantidade que está realmente usando . Eles são "privados" porque (geralmente) excluem arquivos mapeados na memória (ou seja, DLLs compartilhadas). Mas - aqui está o problema - eles não excluem necessariamente a memória alocada por esses arquivos . Não há como saber se uma alteração nos bytes particulares ocorreu devido ao próprio executável ou a uma biblioteca vinculada. Os bytes privados também não são exclusivamente memória física; eles podem ser paginados para o disco ou na lista de páginas em espera (ou seja, não estão mais em uso, mas ainda não foram paginados).
Conjunto de Trabalho refere-se à memória física total (RAM) usada pelo processo. No entanto, diferentemente dos bytes privados, isso também inclui arquivos mapeados na memória e vários outros recursos, por isso é uma medida ainda menos precisa do que os bytes privados. Esse é o mesmo valor que é relatado no "Mem Usage" do Gerenciador de Tarefas e tem sido a fonte de inúmeras quantidades de confusão nos últimos anos. A memória no conjunto de trabalho é "física" no sentido de que pode ser tratada sem uma falha de página; no entanto, a lista de páginas em espera também ainda está fisicamente na memória, mas não é relatada no Conjunto de Trabalho, e é por isso que você pode ver o "Uso da Memória" cair repentinamente quando você minimiza um aplicativo.
Bytes virtuais são o espaço total de endereços virtuais ocupado por todo o processo. É como o conjunto de trabalho, no sentido de incluir arquivos mapeados na memória (DLLs compartilhadas), mas também inclui dados na lista de espera e dados que já foram paginados e estão em um arquivo de paginação no disco em algum lugar. O total de bytes virtuais usados por todos os processos em um sistema sob carga pesada adicionará significativamente mais memória do que a máquina realmente possui.
Portanto, os relacionamentos são:
- Bytes particulares são o que seu aplicativo realmente alocou, mas incluem o uso de arquivo de paginação;
- Conjunto de trabalho são os bytes privados não paginados e os arquivos mapeados na memória;
- Bytes virtuais são o conjunto de trabalho mais bytes privados paginados e lista de espera.
Há outro problema aqui; Assim como as bibliotecas compartilhadas podem alocar memória dentro do seu módulo de aplicativo, levando a possíveis falsos positivos relatados nos bytes privados do seu aplicativo , seu aplicativo também pode acabar alocando memória dentro dos módulos compartilhados , levando a falsos negativos . Isso significa que é realmente possível para o seu aplicativo ter um vazamento de memória que nunca se manifesta nos bytes privados. Improvável, mas possível.
Bytes particulares são uma aproximação razoável da quantidade de memória que seu executável está usando e podem ser usados para ajudar a restringir uma lista de possíveis candidatos a um vazamento de memória; se você vê o número crescendo e crescendo constantemente e infinitamente, você deve verificar se há um vazamento nesse processo. Isso não pode, no entanto, provar que existe ou não um vazamento.
Uma das ferramentas mais eficazes para detectar / corrigir vazamentos de memória no Windows é, na verdade, o Visual Studio (o link vai para a página usando VS para vazamentos de memória, não para a página do produto). O Rational Purify é outra possibilidade. A Microsoft também possui um documento de práticas recomendadas mais gerais sobre esse assunto. Existem mais ferramentas listadas nesta pergunta anterior .
Espero que isso esclareça algumas coisas! Rastrear vazamentos de memória é uma das coisas mais difíceis de fazer na depuração. Boa sorte.