85 votes

Java Thread Garbage collecté ou non

Cette question a été posté sur le site. Je n'ai pas trouver les bonnes réponses, donc je suis le poster ici.

public class TestThread {
    public static void main(String[] s) {
        // anonymous class extends Thread
        Thread t = new Thread() {
            public void run() {
                // infinite loop
                while (true) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                    }
                    // as long as this line printed out, you know it is alive.
                    System.out.println("thread is running...");
                }
            }
        };
        t.start(); // Line A
        t = null; // Line B
        // no more references for Thread t
        // another infinite loop
        while (true) {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
            }
            System.gc();
            System.out.println("Executed System.gc()");
        } // The program will run forever until you use ^C to stop it
    }
}

Ma requête n'est pas à propos de l'arrêt d'un Thread. Permettez-moi de reformuler ma question. La ligne A(voir code ci-dessus) démarre un nouveau Thread; et de la Ligne B de rendre le fil de référence null. Ainsi, la JVM dispose désormais d'un Objet Thread(qui est en cours d'exécution), à laquelle aucune référence n'existe (t=null dans la Ligne B). Donc ma question est, pourquoi est-ce fil(qui n'a pas de référence dans le thread principal) continue à fonctionner jusqu'à ce que le thread principal est en cours d'exécution. Par ma compréhension de l'objet thread doit avoir été nettoyée post Ligne B. j'ai essayé d'exécuter ce code pour 5 minutes et plus, en demandant d'Exécution Java pour exécuter GC, mais le fil ne vient pas de l'arrêter.

De l'espoir à la fois le code et la question est claire cette fois.

122voto

falstro Points 16545

Un thread en cours d'exécution est considéré comme une sorte de collecte des ordures de la racine et est une de ces choses à garder des trucs de déchets ramassés. Lorsque le garbage collector détermine si votre objet est"accessible"ou pas, c'est de toujours le faire à l'aide de l'ensemble de garbage collector racines comme points de référence.

Considérez ceci, pourquoi ton thread principal n'étant pas de ces ordures, personne n'est de référencement que l'on soit.

23voto

Thomas Pornin Points 36984

Comme on l'a expliqué, les threads en cours d'exécution sont, par définition, le système immunitaire de GC. Le GC commence son travail par une analyse "racines", qui sont considérés comme toujours accessible; racines incluent des variables globales ("champs statiques" en Java-talk) et les piles de tous les threads en cours d'exécution (on peut imaginer que la pile d'un thread en cours d'exécution références correspondantes Thread exemple).

Cependant, vous pouvez faire un thread d'un "démon" thread (voir Thread.setDaemon(boolean)). Un fil de démon n'est pas plus garbage collector qu'un non-fil de démon, mais la JVM se ferme lorsque tous les threads en cours d'exécution sont démon. Un moyen d'imaginer, c'est que chaque thread, lorsqu'il se termine, vérifie s'il reste des non-démon de threads en cours d'exécution; si non, le thread de fin de forces un System.exit() appel, qui sort de la JVM (mise à mort de la course les fils de démon). Ce n'est pas un GC liés; et, dans un sens, les threads sont attribués manuellement. Cependant, c'est comment la JVM peut tolérer semi-coquin de fils. Ceci est généralement utilisé pour Timer des cas.

18voto

Thilo Points 108673

La machine virtuelle Java a une référence à tous les threads en cours d'exécution.

Aucun fil (ou les éléments auxquels il fait référence) ne sera collecté pendant qu'il est toujours en cours d'exécution.

12voto

vy32 Points 6298

Le fil de discussion n'est pas mis au rebut car il existe des références aux threads que vous ne pouvez pas voir. Par exemple, il y a des références dans le système d'exécution.

Lorsque le thread est créé, il est ajouté au groupe de thread actuel. Vous pouvez obtenir une liste de threads dans le groupe de thread actuel, ce qui en fait un autre moyen d'obtenir une référence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X