Поток Java Собрал "мусор" или нет

Этот вопрос был отправлен на некотором сайте. Я не нашел правильные ответы там, таким образом, я отправляю его здесь снова.

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
    }
}

Мой запрос не об остановке Потока. Позвольте мне перефразировать свой вопрос. Выровняйте (см. код выше), начинает новую дискуссию; и Строка B делает ссылочный пустой указатель потока. Так, JVM теперь имеет Объект Потока (который находится в состоянии выполнения), к которому никакая ссылка не существует (как t=null в Строке B). Таким образом, мой вопрос, почему это распараллеливает (который больше не имеет никакой ссылки в основном потоке), продолжает работать, пока основной поток не работает. На мое понимание объект потока должен был быть собран "мусор" Строка сообщения B. Я пытался выполнить этот код в течение 5 минут и больше, запрашивая Среду выполнения Java выполнить GC, но поток просто не останавливается.

Надеюсь и код и вопрос являются четкими на этот раз.

83
задан Gray 18 May 2012 в 15:47
поделиться

4 ответа

Работающий поток считается так называемым корнем сборки мусора и является одним из тех средств, которые предотвращают сборку мусора. Когда сборщик мусора определяет, является ли ваш объект « достижимым » или нет, он всегда делает это, используя набор корней сборщика мусора в качестве контрольных точек.

Подумайте, почему ваш основной поток не обрабатывается сборщиком мусора, никто также не ссылается на этот поток.

119
ответ дан 24 November 2019 в 08:50
поделиться

JVM имеет ссылку на все запущенные потоки.

Ни один поток (или вещи, на которые он ссылается) не будет собираться сборщиком мусора, пока он все еще запущен.

18
ответ дан 24 November 2019 в 08:50
поделиться

Как было объяснено, запущенные потоки по определению невосприимчивы к GC. GC начинает свою работу со сканирования «корней», которые считаются всегда достижимыми; Корни включают глобальные переменные («статические поля» в языке Java-talk) и стеки всех запущенных потоков (можно представить, что стек работающего потока ссылается на соответствующий экземпляр Thread ).

Однако вы можете сделать поток потоком «демона» (см. Thread.setDaemon (boolean) ). Поток демона не более сборщик мусора, чем поток, не являющийся демоном, но JVM завершает работу, когда все запущенные потоки являются демонами. Один из способов представить это состоит в том, что каждый поток, когда он завершается, проверяет, остались ли какие-нибудь потоки, не являющиеся запущенными демонами; в противном случае завершающийся поток вызывает вызов System.exit () , который завершает JVM (завершая запущенные потоки демона). Это не проблема, связанная с GC; в некотором смысле потоки распределяются вручную. Однако именно так JVM может терпеть полу-мошеннические потоки. Обычно это используется для экземпляров Timer .

22
ответ дан 24 November 2019 в 08:50
поделиться

Поток не собирается сборщиком мусора, потому что есть ссылки на потоки, которые вы не видите. Например, есть ссылки в системе времени выполнения.

Когда поток создается, он добавляется в текущую группу потоков. Вы можете получить список потоков в текущей группе потоков, так что это еще один способ получить ссылку на него.

12
ответ дан 24 November 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: