Список добавить / добавить все мелкие копии и GC - PullRequest
0 голосов
/ 25 июня 2018

У меня есть ClassA, ClassB и тема B.ClassA попросит ClassB собрать данные с сервера базы данных.После этого ClassA скопирует данные из ClassB, используя List.add.Я понимаю, что ClassA элементы являются мелкими копиями ClassB (только ссылки на копии).

После копирования ClassB выйдет из области видимости, и GC может его утилизировать.

  1. Будет ли GC утилизировать ClassB, даже если объекты, созданные в ClassB, все еще будут ссылаться на ClassA?

  2. Или сохраняет ClassB в памяти?

  3. Или сохраняет только объекты, на которые ссылается другой класс, и избавляется от неиспользуемых объектов.

1 Ответ

0 голосов
/ 25 июня 2018

Сборщик мусора имеет дело со ссылками на объекты, и его анализ найдет все объекты, на которые ваш код содержит ссылки.

Чтобы ответить на ваши три вопроса:

  1. Если ClassA все ещена который ссылается ваш код, то любые объекты, на которые он ссылается (независимо от того, какой класс их создал), не будут собраны.
  2. ClassB находится вне области действия, то есть на него больше не ссылается ваш код.Поэтому имеет право на сбор.Когда это происходит, не определено.
  3. Этот вопрос не совсем понятен.Сборщик будет собирать любые объекты, на которые нет ссылок (прямо или косвенно).

Чтобы предоставить вам немного дополнительной информации, чтобы помочь вам понять это.Когда запускаются обычные GC (некоторые могут этого не делать), они создают так называемый корневой набор.Это список всех объектов, которые напрямую доступны из вашего кода.Это создается путем сканирования всех инициализированных классов (для статических ссылок), а также регистров и стека.Для CMS и G1 этот корневой набор используется для выполнения начальной фазы маркировки (которая выполняется одновременно с потоками приложения).Сборщик возьмет каждую ссылку на объект в корневом наборе и проследит все ссылки на объекты, чтобы создать полный список объектов, к которым можно получить доступ из вашего кода.Если объект недоступен, он не будет отмечен.После того, как маркировка завершена (для CMS и G1 это также требует фазы перемаркировки), у коллектора есть точный список доступных объектов.

Для коллекции молодого поколения действительные объекты копируются в пространство оставшихся в живых или передаются старому поколению.Коллекции старого поколения либо обновляют свободные списки для пробелов между живыми объектами, либо выполняют полную коллекцию компактов, перемещая объекты, чтобы все они были непрерывными в памяти, устраняя фрагментацию.

Существуют другие алгоритмы, которые делают вещи немного по-другому (например,С4 от Азула, на которого я работаю), но общий эффект тот же.

...