Как правильно очистить в Java - PullRequest
0 голосов
/ 02 июля 2019

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

Континент | ________ Страна | ______ Город

Поэтому у континента может быть несколько стран, которые, в свою очередь, могут иметь несколько городов.

 public class City {
      public String name;

      public City(String name) {
          this.name = name;
      }
 }

 public class Country {
      public String name;
      public ArrayList<City> cities = new ArrayList<City>();

      public Country(String name) {
          this.name = name;
      }
 }

 public class Continent {
     public String name;
     public ArrayList<Country> countries = new ArrayList<Country>();

     public Country(String name) {
         this.name = name;
     }
 }

 public static void main(String[] args) {
     City city1 = new City("Berlin");
     City city2 = new City("Paris");
     City city3 = new City("Munich");

     Country country1 = new Country("Germany");
     Country country2 = new Country("France");

     country1.cities.add(city1);
     country1.cities.add(city3);

     country2.cities.add(city2);

     Continent continent1 = new Continent("Europe");
     continent1.countries.add(country1);
     continent1.countries.add(country2);
 }

КакВы можете видеть, что у меня есть объект Continent, который имеет несколько стран в ArrayList, который может иметь несколько городов в каждой.Теперь мой вопрос:

Насколько я знаю, сборщик мусора не касается объектов, на которые есть ссылки, поэтому мне нужно обязательно удалить все ссылки.Итак, когда я прав, тогда

continent1.countries.clear();

недостаточно.В этом случае достаточно ли очистки «стран» ArrayList на континенте объекта и всех «городов» ArrayList в каждой стране объекта?Или я что-то упускаю или, может быть, я совершенно не прав?

1 Ответ

0 голосов
/ 10 июля 2019

Ваше понимание того, как работает сборщик мусора, неверно.

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

В этом случае сборщик может освободить пространство, используемое объектами, которые больше не требуются (т.е. не помечены как активные).То, как это происходит, зависит от того, находятся объекты в молодом или старом поколении и какой алгоритм используется (CMS, параллельный, G1 и т. Д.).

В вашем случае вы ведете отдельные ссылки на все объектытаким образом, даже если континент1 перестанет ссылаться, объекты Country и City не будут собраны.Если бы единственные ссылки на объекты «Страна» и «Город» были через объект «Континент», то их можно было бы собрать, когда был собран континент 1.

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

...