Middle+
Para que serve a separação do Large Object Heap e do Small Object Heap no .NET?
sobes.tech IA
Resposta da IA
A separação do heap LOH e SOH no .NET otimiza a gestão de memória para objetos de tamanhos diferentes.
Small Object Heap (SOH)
- Armazena objetos de até 85 KB.
- Utiliza um coletor de lixo generacional (Generational Garbage Collection - GC).
- Objetos criados recentemente caem na geração 0. Objetos que sobrevivem são movidos para a geração 1, depois para a geração 2.
- A coleta de lixo ocorre com mais frequência e é mais eficiente para objetos pequenos.
// Exemplo de criação de um objeto no SOH
string smallString = "Esta é uma string pequena"; // Menor que 85 KB
object smallObject = new object(); // Objeto pequeno
Large Object Heap (LOH)
- Armazena objetos de 85 KB ou mais.
- Não é generacional no mesmo sentido que o SOH. Normalmente é limpo apenas durante uma coleta completa de lixo (geração 2).
- A alocação de memória no LOH pode ser mais lenta devido à busca por um bloco de memória contíguo.
- A fragmentação do LOH pode causar problemas ao alocar objetos grandes, mesmo que haja memória livre suficiente no total.
- Os objetos no LOH não são movidos pelo GC por padrão (com .NET Framework 4.5.1, foi introduzida a opção de comprimir o LOH, mas ela está desativada por padrão e tem seus custos). Isso evita cópias caras de grandes volumes de dados.
// Exemplo de criação de um objeto no LOH
byte[] largeArray = new byte[100 * 1024]; // Tamanho 100 KB > 85 KB
Vantagens da separação
- Otimização da coleta de lixo: O GC generacional no SOH é muito mais eficiente para objetos pequenos e de curta duração. Mover objetos para o SOH é relativamente rápido.
- Redução da fragmentação do SOH: Mover objetos grandes seria muito custoso e causaria forte fragmentação no SOH. Colocá-los em um heap separado, o LOH, resolve esse problema.
- Minimização de custos adicionais: Mover objetos grandes para o LOH implicaria custos significativos. A não migração pelo GC (por padrão) evita isso.
- Melhoria no desempenho de alocação de memória: A alocação no SOH geralmente é muito rápida (com ponteiros), enquanto no LOH pode ser necessário procurar um bloco livre adequado. A separação ajuda a manter uma alta velocidade de alocação para a maioria dos objetos (pequenos).
| Característica | Small Object Heap (SOH) | Large Object Heap (LOH) |
|---|---|---|
| Tamanho do objeto | Até 85 KB | 85 KB ou mais |
| Modelo de GC | Generacional (gerações 0, 1, 2) | Não generacional (por padrão) |
| Movimentação de objetos | Sim (compactação) | Não (por padrão) |
| Frequência de limpeza | Mais frequente | Menos frequente (normalmente com geração 2) |
| Risco de fragmentação | Baixo (é compactado) | Alto |