Pergunta

Tendo alguns problemas fora da memória com um processo de 32 bits no Windows, comecei a usar o Monitor de Desempenho para registrar determinados contadores para esse processo.

Embora seja normal que os bytes virtuais sejam mais altos do que os bytes privados e o conjunto de trabalho, descobri que, no meu caso, havia uma diferença substancial, bytes virtuais eram Muito de mais alto que os bytes privados e o conjunto de trabalho.

Quais operações específicas e as funções Win32/CRT (em C ou C ++) aumentariam bytes virtuais, mas não bytes privados e conjunto de trabalho?

Eu acho que seria algum tipo de recursos compartilhados, se eu entender a descrição dos diferentes contadores no Monitor de Desempenho.


Como parece haver algumas (para dizer o mínimo), a confusão na convenção de nomenclatura para usar para os contadores de memória em diferentes lançamentos do Windows, bem como em diferentes aplicativos no mesmo lançamento do Windows, montei o seguinte:

Informações do MSDN

De acordo com MSDN - Limites de memória para lançamentos do Windows, o limite de espaço de endereço virtual no modo de usuário em janelas de 32 bits para cada processo de 32 bits é normalmente 2 GB. Pode ser de até 3 GB com IMAGE_FILE_LARGE_ADDRESS_AWARE e 4GT.

Abaixo está uma descrição dos diferentes contadores no Monitor de Desempenho, juntamente com as colunas correspondentes no gerenciador de tarefas e a estrutura Win32 que mantém as informações, de acordo com MSDN - Informações de desempenho da memória.

Bytes virtuais

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 memória ou de memória principal. O espaço virtual é finito e o processo pode limitar sua capacidade de carregar bibliotecas.

Gerenciador de tarefas XP: N/A
Gerente de tarefas Vista: n/a
Estrutura: MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual

Bytes privados

Bytes privados é o tamanho atual, em bytes, de memória que esse processo alocou que não pode ser compartilhado com outros processos.

Gerenciador de tarefas XP: Tamanho da VM
Gerente de tarefas Vista: tamanho de confirmação
Estrutura: PROCESS_MEMORY_COUNTERS_EX.PrivateUsage

Conjunto de trabalho

O conjunto de trabalho é o tamanho atual, em bytes, do conjunto de trabalho desse processo. O conjunto de trabalho é o conjunto de páginas de memória tocadas recentemente pelos threads no processo. Se a memória livre no 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 a partir de conjuntos de trabalho. Se forem necessários, serão falhados com falha macia no conjunto de trabalho antes de deixar a memória principal.

Gerenciador de tarefas XP: Uso do MEM
Gerente de tarefas Vista: conjunto de trabalho
Estrutura: PROCESS_MEMORY_COUNTERS_EX.WorkingSetSize

Foi útil?

Solução

Coisas que (podem) aumentar os bytes virtuais sem aumentar os bytes privados em que consigo pensar agora:

  • Os binários são frequentemente compartilhados (ou seja, não privados), mas ocupam espaço de endereço significativo. Isso pode ser ainda maior que o tamanho do binário

  • Usando o VirtualAlloc para reservar o espaço de endereço seqüencial sem cometê -lo / acessar. Os gerentes de memória personalizados podem fazer isso.

  • Usando um arquivo mapeado de memória (sem acessá -lo completamente)

Outras dicas

Ao usar o VirtualAlloc, você pode alocar espaço de endereço virtual sem realmente alocar nenhuma memória física. Isso deve aumentar a contagem de "byte virtual", mas não o seu tamanho de conjunto de trabalho.

A memória fora da memória pode ser causada pela execução do espaço de endereço, porque reservando muito o espaço de endereço.

Qual é a sua linguagem de programação?

Em estruturas gerenciadas, os bytes privados representam dados que são alocados por recursos não gerenciados. Enquanto bytes virtuais representam o uso total da memória (dados não gerenciados e gerenciados).

Assim, é muito comum ver diferenças substanciais entre bytes privados e virtuais em tais estruturas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top