Re seu último Q - a versão curta: A mensagem de erro é sobre o espaço de endereço virtual "confirmado". Se você olhar para o gráfico Commit Charge no instantâneo da segunda tela, verá que ele está realmente no limite ou muito próximo dele.
A quantidade de RAM "livre", "disponível" ou "em uso" não importa. Em particular, a falta de RAM "disponível" não é absolutamente o motivo da mensagem "pouca memória" ou "falta de memória".
O limite de confirmação é igual ao tamanho total da RAM + do arquivo de paginação. Quando a memória confirmada é alocada, ela é imediatamente cobrada para "confirmar a carga", embora ainda não tenha sido realmente usada ... o que significa que nenhum espaço de RAM ou PF é usado imediatamente. O espaço físico (na RAM ou no arquivo de paginação) é usado apenas quando a memória é realmente referenciada. A partir de então, ele deve ter um lugar para estar, até que o programa o libere ou que todo o processo termine.
Exemplo: suponha que você não tenha um arquivo de paginação, portanto, seu limite de confirmação é de 16 GB (seu tamanho de RAM). Agora, suponha que 8 processos tentem VirtualAlloc (MEM_COMMIT) 1 GB. Resultado: a taxa de confirmação é aumentada em 8 GB. No entanto, não há impacto imediato na RAM! É como se você tivesse comprado um bloco de papel na papelaria, mas na verdade não recebeu nenhum papel. Toda vez que você precisa de uma nova planilha, uma aparece magicamente. Até você usar o teclado inteiro (o tamanho da região alocada).
Agora, suponha que cada um desses processos acesse apenas 100 MB de seus 1 GB. A RAM usada seria apenas 800 MB.
Mas como cada um deles pode fazer referência a todos os seus 1 GB, o sistema operacional deve garantir que 8 GB de RAM + espaço no arquivo de paginação ... bem, apenas a RAM no caso de nenhum arquivo de paginação ... seja mantida disponível caso isso aconteça . Voltando à papelaria, eles precisam manter papel suficiente em estoque para dar a todos as folhas tantas quanto compraram anteriormente.
Portanto, o sistema operacional deve parar de permitir que o VirtualAlloc (MEM_COMMIT) seja bem-sucedido quando o valor atual confirmado atingir o limite.
Por quê? Como é esperado que o processo verifique o resultado do VirtualAlloc para ver se foi bem-sucedido. Depois de fazer isso e constatar que a alocação foi bem-sucedida, o processo tem todo o direito de esperar que suas referências subsequentes a toda a região comprometida sejam bem-sucedidas.
Se o Windows permitir que a cobrança de confirmação exceda a quantidade de espaço disponível para realizar esse espaço, essa expectativa nem sempre poderá ser atendida.
Uma solução rápida é aumentar o tamanho padrão (= inicial) do seu arquivo de paginação. A partir da explicação acima, você poderá ver por que isso evitará a mensagem de erro, mesmo que nada possa ser gravado nesse arquivo . Novamente, o sistema operacional está garantindo que o espaço para toda a taxa de confirmação esteja disponível , caso seja necessário . Quando processos alocam memória confirmada, eles estão apenas dizendo "ei, SO, eu posso precisar disso". Isso não significa que eles realmente o usarão, e certamente não significa que eles realmente o usaram ainda.
Para mais, veja minha resposta aqui .
Agora .... por que você está usando tanto commit quando seus processos parecem não aumentar, é outra questão. Para começar a analisar isso, mostre a guia Desempenho do Gerenciador de Tarefas, seção Memória.