Будет ли установка единственной ссылки на null означать, что она и ее дочерние потоки будут собираться? - PullRequest
1 голос
/ 31 октября 2008

У меня есть приложение, которое должно работать как служба, я создаю объект, который затем порождает множество потоков.

Если я установлю единственную ссылку на этот объект на null, будут ли очищены все дочерние потоки? или я буду страдать от утечки памяти.

Должен ли я явно завершать все дочерние потоки?

Ответы [ 4 ]

7 голосов
/ 31 октября 2008

Потоки и статические ссылки являются «корневыми объектами». Они невосприимчивы к GCing, и все, что может быть отслежено непосредственно или косвенно, не может быть собрано. Поэтому потоки не будут собираться до тех пор, пока они работают. Однако после выхода из метода run GC может поглотить любые объекты потока, на которые нет ссылок.

6 голосов
/ 31 октября 2008

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

Вот пример на C # для совместного завершения потоков - его легко перевести на Java.

2 голосов
/ 31 октября 2008

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

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

См. javadoc для темы для получения дополнительной информации.

0 голосов
/ 31 октября 2008

Независимо от теории (или ответов StackOverflow), вы также должны создать тест, чтобы увидеть, действительно ли то, что вы намеревались сделать, происходит. Возможно, у вас есть забытый указатель, предотвращающий сборку мусора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...