Pergunta

Enquanto olhava para o Documentação do temporizador Encontrei o seguinte exemplo com este comentário:

    // Normally, the timer is declared at the class level,
    // so that it stays in scope as long as it is needed.
    // If the timer is declared in a long-running method,  
    // KeepAlive must be used to prevent the JIT compiler 
    // from allowing aggressive garbage collection to occur 
    // before the method ends. You can experiment with this
    // by commenting out the class-level declaration and 
    // uncommenting the declaration below; then uncomment
    // the GC.KeepAlive(aTimer) at the end of the method.
    //System.Timers.Timer aTimer;
    code in between
    // If the timer is declared in a long-running method, use
    // KeepAlive to prevent garbage collection from occurring
    // before the method ends.
    //GC.KeepAlive(aTimer);

Isso significa que o GC em C# tem permissão para coletar variáveis ​​locais, mesmo que isso tenha efeitos colaterais?Presumivelmente porque não estou acessando o cronômetro novamente, o GC pode coletá-lo mais cedo?

Não tenho certeza se sou fã dessa otimização se entendi isso corretamente (mas provavelmente não entendo;))

Foi útil?

Solução

Sim, o GC pode coletar a variável local antes do término do escopo, assim que após o último uso da variável.Colocar GC.KeepAlive no final do método garante que a variável estará 'ativa' até a chamada de KeepAlive.

C# é uma linguagem imperativa, portanto o GC não foi projetado para saber nada sobre efeitos colaterais.

Outras dicas

Pelo que entendi, o GC marcará qualquer variável ou objeto que considere não ser mais necessário como candidato à Coleta de Lixo durante o próximo ciclo do GC.Não tenho certeza se entendi o aplicativo específico aqui, mas sei que há casos em que o GC pode marcar um recurso para coleta quando ele ainda é necessário (mas não parece devido à forma como o código é escrito).

Normalmente, durante os métodos, um objeto ou variável permanece no escopo durante a chamada do método, mas se a chamada do método durar mais do que o tempo entre os ciclos do GC, o GC poderá ver seu objeto Timer como fora do escopo e marcá-lo para coleta. .Adicionar o método GC.KeepAlive força o GC a esperar até que o método termine antes de agir no objeto Timer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top