WinDBG: Memory I - Introdução

Agora sim a parte mais interessante vai começar... tanto que para isso teremos que dividir a parte de análise de memória em diversas partes. E para começar, será necessário introduzir alguns conceitos.

Conceitos Básicos

Esta seção irá apresentar alguns conceitos básicos relacionados ao core do Windows, sem ligação direta e exclusiva com aplicações .NET.

Private Virtual Address Space

Em termos mais simples, private virtual address space é um conjunto de endereços de memória que um determinado processo pode utilizar.

Virtual Memory

Virtual Memory funciona mais ou menos como uma visão simplificada da memória física. Um processo enxerga apenas o seu private virtual address space, de uma maneira linear e organizada. O gerenciador de memória então é o responsável por mapear estes endereços de memória para os endereços físicos de maneira correta.

memoria

Mapeamento de memória virtual (esq.) para física (dir.)

 

A capacidade da memória virtual varia de acordo com a plataforma de hardware. Se fizermos a conta, plataformas 32-bit podem alocar no máximo 4Gb (2^32). Por padrão, o Windows aloca metade deste espaço para utilização do sistema operacional. Portanto, a outra metade apenas é utilizada para outros processos.

E claro, como quase tudo, temos uma saída para mudar estes valores. Em alguns casos, 2 Gb para o sistema operacional pode parecer muito. É possível então especificar o valor de 1Gb para o sistema operacional e 3 Gb para processos, através configuração do boot (Boot.ini). Existe ainda uma outra opção, Address Windowing Extesions, que permite que aplicações 32-bit utilizem 64Gb de memória física em 2Gb de espaço de endereço virtual.

Não vou entrar em detalhes neste post, esta questão está fora do escopo de hoje. Se quiser saber mais informações, entre em contato :)

Em sistemas 64-bit o espaço é muiiiiito maior: 8192Gb de espaço para processos e 6657 para sistema operacional. Digamos que agora não tem do que reclamar :)

Performance Monitor

O famoso perfmon deve ser ferramenta básica para análise de memória. Como estes posts estão relacionados a aplicações .NET, os contadores abaixo serão muito utilizados.

  • .NET CLR Memory / # Bytes in all Heaps
  • .NET CLR Memory / Large Object Heap Size
  • .NET CLR Memory / Gen 2 Heap Size
  • .NET CLR Memory / Gen 1 Heap Size
  • .NET CLR Memory / Gen 0 Heap Size
  • Process / Private Bytes
  • Process / Virtual Bytes

Antes de entrarmos nos contadores .NET CLR Memory, vou explicar os dois últimos itens.

Private Bytes se refere ao total em bytes de committed memory de um determinado processo. Já Virtual Bytes se refere ao total do virtual address space para este processo. Mais para frente vamos ver a clara relação destes dois contadores.

Para entrar nos outros contadores será necessário introduzir alguns conceitos de GC, que será realizado no próximo post.

Abraços!

No Comments