O que o Coletor de Lixo pode e não pode fazer?

8

O GC cuidará de todos os problemas de gerenciamento de memória (vazamentos de memória)?

Existe algum caso em que você não deseja que o GC assuma o controle de parte do seu código?

invariante
fonte
Ele não pode se recompor, mesmo que deva.
rightfold 27/10/11

Respostas:

10

Ele cuidará dos problemas clássicos de gerenciamento de memória (a memória alocada não será desativada quando não estiver mais em uso), embora ainda seja possível haver vazamentos de memória com um sistema GC - isso será mais sutil e ocorrerá quando os objetos ainda mantiverem referências para outros objetos, mesmo quando eles não precisam mais.

Veja a pergunta Por que o .NET não pode ter vazamentos de memória? e é respostas no StackOverflow.

Pode haver x. situações em que você deseja controle total sobre a alocação de memória, mas, francamente, os benefícios de um sistema de GC são tais que você normalmente não precisará.

Oded
fonte
1
As únicas situações em que consigo pensar em que as penalidades são muito altas estão em sistemas que movem grandes quantidades de dados muito rapidamente através da memória limitada, como gráficos avançados ou sistemas com memória muito limitada em primeiro lugar, como um controlador incorporado.
Engenheiro Mundial
@WorldEngineer - Verdadeiro, é por isso que o .NET fixou objetos, permitindo mais controle sobre seções da memória.
Oded
High Performance Computing, sistemas de negociação de baixa latência etc todos gostariam controle sobre seu GC :-)
Martijn Verburg
Oh, eles poderiam ajustá- lo muito bem. Existe até toda uma classe de GCs de ponta dedicados a reduzir as pausas e limitar o tempo gasto no GC (GCs incrementais e simultâneos), com canidatos prontos para produção. Mas, aparentemente, nem isso é suficiente para alguns deles (não sei dizer se isso é razoável). Então eles deixam, junto com a compilação JIT.
@SamSaffron postou este link no twitter com um artigo onde o comportamento explícito de GC foi (ab) usado para ganhar uma vantagem marcgravell.blogspot.com/2011/10/assault-by-gc.html
Carlo Kuip
2

Existem muitos problemas de memória (ponteiros oscilantes, saturação de buffer e similares) e problemas de recursos (vazamentos de memória, outros vazamentos de recursos). O coletor de lixo cuida de:

  • ponteiros pendurados
  • principalmente vazamentos de memória
  • parcialmente outros vazamentos de recursos

A linguagem que não permite a aritmética de ponteiros cuida de:

  • saturações de buffer e outros casos de ponteiros inválidos

Também não é possível resolver outros casos de problemas de recursos nos quais você esquece de remover a referência / memória / recurso de algum lugar, para que ainda possa haver vazamento de memória com o GC (os objetos Exception são especialmente notáveis ​​por referenciar muitas coisas que você não conhece).

Embora o GC possa ajudá-lo a liberar outros recursos além da memória pelo uso de finalizadores (destruidores), ele liberará esses recursos com atraso não determinístico, o que geralmente não é apropriado para recursos como arquivos ou soquetes de rede. Para lidar com esse tipo de problema de recursos, você precisa de alguma construção de linguagem para recursos com escopo, como usar instrução em C #, idioma RAII em C ++ ou a extensão mais recente para experimentar a sintaxe no Java 7 e ainda é apenas ajuda, porque você deve usá-lo no código .

Não é necessário permitir aritmética do ponteiro e criar endereços a partir de números para poder executar um coletor de lixo preciso. Algumas otimizações úteis, como a compactação, só podem ser implementadas em coletores precisos (você só pode mover objetos se souber com certeza o que é uma referência, para atualizá-la; não é possível em C / C ++).

Jan Hudec
fonte
1

A coleta de lixo funciona bem para memória. Se você tem uma tonelada de memória, por que executar a limpeza de todos os bytes como é feito? O GC normalmente responde à "pressão da memória" e limpa quando necessário. Isso é bom para a memória. No entanto, se você tiver um objeto que contém um recurso que não é de memória (identificador de arquivo, conexão com o banco de dados, bloqueio) aguardando até que a pressão da memória dispara o GC, geralmente significa manter esse recurso por muito tempo. Você precisa de outra abordagem para esses recursos. Isso pode significar uma referência que conta o recurso compartilhado, com liberação determinística quando a contagem de referência chega a zero ou a abordagem usando / Dispose do .NET.

Kate Gregory
fonte
0

GC systems é um software que tenta otimizar o uso de memória para um programa em execução.

O sistema GS é de responsabilidade e é um componente da estrutura (JVM / .NET).

Ele pode liberar memória para alguns objetos que ele prevê que não serão necessários para um aplicativo após um determinado ponto no processamento.

No .NET, ele pode liberar memória apenas para alguns objetos nativos do .NET e não para o objeto MS COM.

Objetos MS COM usados ​​no .NET devem ser liberados explicitamente.

Referências:

MSDN: Coleta de Lixo

Wikipedia: Coleção Gabage

NoChance
fonte
Por rebaixado - Seu feedback é apreciado?
NoChance