Estou tentando usar o utilitário perfmon windows para depurar vazamentos de memória em um processo.
É assim que a perfmon explica os termos:
Conjunto de Trabalho é o tamanho atual, em bytes, do Conjunto de Trabalho deste processo. O Conjunto de Trabalho é o conjunto de páginas de memória recentemente tocadas pelos threads no processo. Se a memória livre do computador estiver acima de um limite, as páginas serão deixadas no conjunto de trabalho de um processo, mesmo que não estejam em uso. Quando a memória livre cai abaixo de um limite, as páginas são cortadas em Conjuntos de trabalho. Se necessário, eles sofrerão uma falha suave no conjunto de trabalho antes de deixar a memória principal.
Bytes virtuais é o tamanho atual, em bytes, do espaço de endereço virtual que o processo está usando. O uso do espaço de endereço virtual não implica necessariamente o uso correspondente das páginas de disco ou de memória principal. O espaço virtual é finito e o processo pode limitar sua capacidade de carregar bibliotecas.
Bytes particulares é o tamanho atual, em bytes, de memória que esse processo alocou e não pode ser compartilhado com outros processos.
Estas são as perguntas que tenho:
São os Bytes Privados que devo medir para ter certeza de que o processo está apresentando algum vazamento, pois não envolve bibliotecas compartilhadas e, caso ocorra algum vazamento, se ocorrer, virá do próprio processo?
Qual é a memória total consumida pelo processo? São os Bytes Virtuais ou a soma dos Bytes Virtuais e do Conjunto de Trabalho?
Existe alguma relação entre bytes privados, conjunto de trabalho e bytes virtuais?
Existem outras ferramentas que dão uma idéia melhor do uso da memória?
Respostas:
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:
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.
fonte
Você não deve tentar usar perfmon, gerenciador de tarefas ou qualquer outra ferramenta para determinar vazamentos de memória. Eles são bons para identificar tendências, mas não muito mais. Os números relatados em termos absolutos são muito vagos e agregados para serem úteis para uma tarefa específica, como detecção de vazamento de memória.
Uma resposta anterior a esta pergunta deu uma ótima explicação sobre quais são os vários tipos.
Você pergunta sobre uma recomendação de ferramenta: eu recomendo o Validador de memória. Capaz de monitorar aplicativos que fazem bilhões de alocações de memória.
http://www.softwareverify.com/cpp/memory/index.html
Isenção de responsabilidade: projetei o Validador de memória.
fonte
A definição dos contadores de perfmon foi quebrada desde o início e, por algum motivo, parece ser muito difícil de corrigir.
Uma boa visão geral do gerenciamento de memória do Windows está disponível no vídeo " Mistérios do gerenciamento de memória revelado " no MSDN: abrange mais tópicos do que o necessário para rastrear vazamentos de memória (por exemplo, gerenciamento de conjuntos de trabalho), mas fornece detalhes suficientes nos tópicos relevantes.
Para lhe dar uma dica do problema com as descrições do contador perfmon, aqui está a história interna sobre bytes privados de " Private Bytes Performance Counter - Beware! " No MSDN:
Do " Planejamento de desempenho " no MSDN:
fonte
Há uma discussão interessante aqui: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/307d658a-f677-40f2-bdef-e6352b0bfe9e/ Meu entendimento desse segmento é que liberar pequenas alocações é não refletido em bytes particulares ou conjunto de trabalho.
Longa história curta:
se eu ligar
os bytes privados refletem apenas a alocação, não a desalocação.
se eu ligar
os bytes privados refletem corretamente a alocação e a desalocação.
fonte