Ao longo dos anos usando o Windows, estou acostumado ao Gerenciador de tarefas. A partir daí, matei centenas de aplicativos por mau comportamento. Lá, ele observou qual deles devora recursos. Até eu começar a trabalhar com máquinas com centenas de gigabytes de memória e aplicativos com solicitações correspondentes. Este artigo discute por que o Gerenciador de Tarefas não controla bem a memória e o que usar em troca. Em primeiro lugar, sobre o mecanismo de alocação de memória no Windows.
tl; dr: O gerenciador de tarefas oculta informações sobre a memória paginada e o espaço virtual do processo. Melhor usar o Process Explorer do pacote Sysinternals.
Alocação do Windows
Ao iniciar um novo processo, o sistema operacional atribui um espaço de endereço contínuo a esse processo. Em sistemas de 32 bits, esse espaço pode ser de 4 GB, geralmente 2 GB para o kernel e o restante para o processo. Este artigo ignorará o uso da memória principal. Em sistemas de 64 bits, a memória reservada ao processo pode aumentar para incríveis 64 TB. O que esse processo fará com alguns terabytes de memória quando realmente tivermos 8 GB miseráveis? Primeiro, você precisa entender o que é memória reservada e transferida.
Memória reservada e transferida
Nem todas as partes desse enorme espaço de endereço são iguais. Algumas partes do espaço de endereço do processo são realmente suportadas pela RAM física ou por um disco (veja abaixo). A memória reservada é considerada confirmada se o sistema operacional oferecer essa memória quando você tentar usá-la. O restante do espaço de endereço, e essa é a grande maioria, permanece disponível para reserva. Ou seja, o sistema operacional nem sempre oferece esse bloco de memória para uso: ele pode fazer uma cópia no disco (arquivo de troca), por exemplo, ou não. No C ++, a memória é reservada chamando
VirtualAlloc . Portanto, a memória transferida é um recurso limitado de hardware no sistema operacional. Vamos ver
Arquivo de troca do SO
O arquivo de troca é uma ótima idéia. Basicamente, o sistema operacional
entende que algumas partes da memória não são particularmente usadas pelo seu aplicativo. Por que gastar memória física real nele? Em vez disso, o processo do kernel grava esse fragmento não utilizado no disco. Até que se voltem para ele novamente, só então ele voltará à memória.
Para uma explicação mais detalhada de como a memória funciona no Windows, recomendo a palestra
"Segredos do gerenciamento de memória", de Mark Russinovich.
Rastreamento de memória
Há muito para assistir e analisar. Com quem entrar em contato? Claro, para o Gerenciador de tarefas!
A memória RAM é geralmente chamada de Conjunto de Trabalho, enquanto toda a memória alocada é geralmente chamada de Bytes Privados. As DLLs confundem definições, portanto, ignore-as por enquanto. Em outras palavras:
Private Bytes [ ] = +
Por padrão, o Gerenciador de tarefas mostra exatamente o conjunto de trabalho para qualquer processo:

E este é o número que eu olhei o tempo todo. Como eu sabia que no Gerenciador de tarefas as informações sobre a memória transferida estão na coluna
Commit Size
da
Commit Size
. Não consegui encontrar informações sobre memória virtual lá.
O gerenciador de tarefas permite adicionar informações sobre a memória transferida, se você clicar com o botão direito do mouse nas colunas e selecionar o item correspondenteMétricas eficazes de memória
Felizmente, existem muitos outros recursos para rastrear recursos. O PerfMon (System Monitor) é instalado em cada máquina Windows, o que fornece informações muito detalhadas sobre cada processo e o sistema como um todo:

Curiosamente, o System Monitor pode realmente examinar e comparar métricas em dois ou mais computadores na rede. Esta é uma ferramenta muito poderosa, mas o Gerenciador de tarefas é obviamente mais amigável. Eu recomendo o
Process Explorer como uma solução intermediária:

Boom! Visual Studio, por que você ainda está no modo de 32 bits (preste atenção ao seu Tamanho virtual)? O pico de uso de memória no meu computador em 89% do máximo ainda é suportável. Isso será útil mais tarde.
Além: muitos apontaram para outras ferramentas convenientes, incluindo
VMMap e
RAMMap .
Depurando informações da memória
Felizmente, essas não são algumas curiosidades desnecessárias do sistema operacional. Informações reais sobre consumo de memória me ajudaram muitas vezes na depuração de vários problemas.
O mais importante é encontrar as partes
intocadas da memória alocada. A troca de dados também é importante: essa memória é transferida, mas raramente é usada ou não é usada.
Mesmo que a memória seja usada algumas vezes, é importante entender que esse é um recurso caro, portanto você nunca deve seguir esse caminho. Vazamentos de memória serão exibidos aqui.
Por esses motivos, ouvi anteriormente uma sugestão para excluir completamente o arquivo de paginação e igualar a memória alocada ao conjunto de trabalho. No entanto, essa é uma ideia de dois gumes. O sistema operacional não poderá despejar memória em caso de operação incorreta de aplicativos que às vezes reservam memória em vão.