O post gerenciamento de memória em C# explica como funciona o gerenciamento de memória realizado pelo computador e demonstra como funciona a passagem de parâmetros por valor e por referência nas funções.
Gerenciamento de memória em C#
O computador realiza o gerenciamento de memória em C# dividindo a memória em duas áreas, a área denominada Stack e a área denominada Heap.
A área denominada Stack funciona em formato de pilha, ocupando uma pequena área da memória RAM (alguns KB). Já a área denominada Heap ocupa a maior área da memória, alterando seu tamanho dinamicamente conforme a necessidade.
O Heap é acessado indiretamente, por meio de referência, por isso chamamos os dados da Heap de “Reference Type”. O custo de se criar um objeto na Heap é muito maior do que na Stack, sendo assim na área de memória Stack nós temos os Value Types que são as variáveis do Tipo numérico (int, long, short etc), ponto flutuante (float, double), decimal, booleanos (true e false) e estruturas definidas pelo usuário (struct). Na Heap nós temos os Reference Types do tipo: Classes, Interfaces e Delegates.
As características dos tipos alocados em cada uma dessas áreas são as seguintes:
Value Types:
- Uma variável deste tipo contém o valor, e não um endereço de referência para o valor;
- Derivam de System.ValueTypes;
- Variáveis de escopo local precisam ser inicializadas antes de serem utilizadas;
- Atribuir o valor de variável a outra, implicitamente, é feita uma cópia do conteúdo da variável. Sendo assim, qualquer alteração no conteúdo de uma delas, não afetará a outra. Quanto maior for um objeto deste tipo mais custosa será sua cópia.
Reference Types:
- Uma variável contém a referência (ou endereço) para o objeto que está na Heap;
- Atribuir o valor de uma variável para outra faz uma cópia da referência, e não do próprio objeto. Ou seja, não é feita a cópia do objeto, e sim do endereço de memória do objeto, o que não gera muito custo para objetos grandes;
- São alocados na Heap e seus objetos são coletados pelo Garbage Collector;
- São passados por referência, enquanto que Value Types são passados por valor. Ou seja, a alteração de um objeto afetará todas as instâncias que apontam para ele.
O Garbage Collector (GC)
Como na Heap todos objetos são referenciados, o GC verifica se existe alguma variável fazendo referência a determinado objeto, caso não encontre ele desaloca “Coleta” aquela área de memória. Um fato interessante, por mais que se chame o Garbage Collector a sensação que temos é de que ele irá entrar em ação no mesmo instante, mas não, estamos apenas sinalizando a ele. “Passe por aqui GC”.
Passagem de Parâmetros por Valor ou por Referência
Acesse nosso canal no YouTube para visualizar outros vídeos sobre programação, como por exemplo Python, Java e Desenvolvimento de sistemas comerciais utilizando a linguagem C#.
Parte do material presente nesse post foi retirado do site “http://eduardopires.net.br“.