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?
java
programming-languages
c#
invariante
fonte
fonte
Respostas:
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á.
fonte
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:
A linguagem que não permite a aritmética de ponteiros cuida de:
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 ++).
fonte
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.
fonte
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
fonte