2014-03-05 2 views

ответ

2

Там всегда только один сборщик мусора, который работает в нем собственный Thread

+0

спасибо antoine, да Runtime - это одноэлементный режим, но когда мы вызываем Runtime.gc(), jvm внутренне создадим один поток, который представляет собой мусорный сборщик (поток демона). но в этом случае, когда мы будем называть gc в двух разных потоках за раз, сколько GC объектов будет создано. –

+1

@RajasekharBurepalli Вызов 'gc()' НЕ создает новый поток. 'gc()' просто запускает методы финализации любых объектов, ожидающих завершения. – Rainbolt

+0

@John - Половина права. Вы правы, что не создает новый поток. Но вызов 'gc()' NOT * "просто запускает методы финализации любых объектов, ожидающих завершения" *. Он фактически запускает сборщик мусора, и обычно он выполняет ** полный ** GC. –

1

Там один сборщик мусора, как другие указали.
Вы не должны заботиться о количестве объектов сбора мусора
или о любых деталях о сборщике мусора. Это что-то
на уровне JVM/system. Все, о чем вы заботитесь, - это когда ящик явно вывожу мусор
(если вы хотите это сделать).

1

(Это ответ на комментарии Op, который раскрывающих природу недоразумение, которое в корне его вопроса см. Цитируемый текст ...)

да время выполнения одноэлементно, но когда мы вызывает Runtime.gc(), ...

Правильной

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

Неверный. Он не создает новый поток GC. Скорее, это заставляет поток существующей GC просыпаться и делать сборку мусора. Кроме того:

  • поток, вызывающий gc() не вернется, пока сборщик мусора не завершена.

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

... но в этом случае, когда мы называем дс в двух разных потоков одновременно, сколько GC объекты будут созданы?

Отсутствует. Если два метода одновременно вызовет gc(), GC будет выполняться один раз в существующей потоке GC. Подумайте о GC как о «двигателе», который либо работает, либо спит в любой момент времени. Вызов gc() будет обычно заставляет GC запускаться, если он в данный момент находится в режиме сна.

(На самом деле, я упрощая вещи немного. CMS и G1 имеют сложность, что gc() обычно работать параллельно с потоками приложений. Другая возможность состоит в том, что gc() вызов будет просто проигнорирован. Наконец, GC типичный имеет множество способов: например, коллекцию молодого поколения и полную коллекцию. Вызов gc() начнет полную сборку.)

...но мы говорим, что GC является демон нить

Да (вроде),

ГХ может иметь несколько потоков. Обычно имеется основной поток GC и другой поток для обработки финализации. И для некоторых видов GC некоторые задачи выполняются параллельно, используя пул потоков.

, а также дс() имеет встроенную реализацию

Для обычных виртуальных машин, да. (Но в качестве контр-примера, в JNode реализовано на Java, хотя и с использованием методов Unsafe и т. Д.)

то что такое GC?

Это «материал», который делает сборку мусора. Что действительно происходит под капотом, зависит от JVM, и зависит от параметров JVM и т. Д.

+0

отличная степен, спасибо. –

+0

Кто бы ни проголосовал - пожалуйста, объясните сами. –

Смежные вопросы