Sobes.tech
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

  1. 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.
  2. 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.
  3. 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.
  4. 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