DEV Community

Cristiano Rodrigues for Unhacked

Posted on

Desvendando o Large Object Heap (LOH): Tudo o que um Desenvolvedor precisa saber

O Large Object Heap (LOH) é um componente fundamental da coleta de lixo na plataforma .NET. É responsável pelo gerenciamento de objetos grandes na memória, que são aqueles com mais de 85.000 bytes de tamanho.

Embora o LOH seja uma parte importante da coleta de lixo na plataforma .NET, muitos desenvolvedores não têm uma compreensão completa de como ele funciona e como afeta o desempenho do aplicativo.

Quando um objeto grande é alocado no LOH, ele é alocado em um segmento separado da memória. Este segmento não está vazio como muitos pensam, alguns tipos utilizados pelo CLR são alocados neste segmento.

O LOH é coletado sempre que ocorre uma coleta GC FULL, mas também pode ser responsável por acionar essa coleta. Além disso, ele possui seu próprio valor de Allocation Budget. Para mais informações sobre o Allocation Budget, consulte este artigo).

Conforme os objetos grandes são alocados e desalocados no LOH, a memória pode se tornar fragmentada. Por padrão, o LOH só executa o processo de sweeping, o que significa que a compactação não é realizada. Imagine mover objetos maiores que 85.000 bytes durante o processo de compactação – seria ineficiente.

A falta de compactação pode levar a um problema conhecido como fragmentação de heap, que afeta negativamente o desempenho do aplicativo, pois o GC precisa localizar um espaço contínuo dentro do segmento para alocar o objeto.

Ao contrário do que muitos pensam, é possível definir um limite para o tamanho dos objetos alocados no LOH. Existem várias opções disponíveis.

Site Microsoft

O tamanho do segmento LOH pode ser ajustado para otimizar o desempenho do aplicativo e minimizar a fragmentação de heap equilibrando a alocação de memória no LOH.

Embora não seja realizado por padrão, é possível programaticamente realizar a compactação. Para isso, use o seguinte código:

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();
Enter fullscreen mode Exit fullscreen mode

Porém desde o dotnet 3.0, o GC pode pode optar por compactar nos casos de chegar a um limite crítico.

Se o consumo for maior do que 90% e se a fragmentação LOH for maior que 12,5% ou se parecer produtivo o tamanho estimado dos objetos recuperados (≥ ⅛ limite rígido).

O Large Object Heap é importante na coleta de lixo na plataforma .NET. No entanto, a fragmentação de heap pode afetar negativamente o desempenho do aplicativo, e os desenvolvedores devem minimizar a fragmentação de heap e otimizar o uso do LOH.

Top comments (0)