Question

Tout en regardant le Documentation de la minuterie J'ai traversé l'exemple suivant avec ce commentaire:

    // 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);

Cela signifie-t-il que le GC en C # est autorisé à collecter des variables locales même si elle aurait des effets secondaires? Vraisemblablement parce que je n'accepte plus la minuterie par la suite, le GC peut le récupérer plus tôt?

Je ne suis pas sûr que je suis fan d'une telle optimisation si je comprends bien (mais alors je ne le fais pas;))

Était-ce utile?

La solution

Oui, GC peut collecter une variable locale avant de terminer la portée, dès que après la dernière utilisation de la variable. Mettre GC.Keepalive à la fin de la méthode garantit que la variable sera «vivante» jusqu'à l'appel Keepalive.

C # est un langage impératif, donc le GC n'a pas été conçu pour savoir quoi que ce soit des effets secondaires.

Autres conseils

Pour autant que je comprenne le GC, il marquera toute variable ou objet qui, selon elle, n'est plus nécessaire en tant que candidat à la collecte des ordures au cours du prochain cycle GC. Je ne suis pas certain de comprendre l'application particulière ici, mais je sais qu'il y a des cas où le GC pourrait marquer une ressource pour la collecte lorsqu'elle est encore nécessaire (mais n'apparaît pas en raison de la façon dont le code est écrit).

Normalement, pendant les méthodes, un objet ou une variable reste dans la portée pendant la durée de l'appel de la méthode, mais si l'appel de méthode dure plus longtemps que le temps entre les cycles GC, le GC peut voir votre objet temporaire comme hors de portée et le marquer pour la collection . L'ajout de la méthode GC.keekeve oblige le GC à attendre la sortie de la méthode avant d'agir sur l'objet Timer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top