Android сборщик мусора, освобождение объектов внутри объектов - PullRequest
1 голос
/ 18 августа 2011

Мне очень интересно, как эта штука работает внутри Android.У меня есть класс с двумя List <> внутри, созданный во время выполнения и загруженный объектами, созданными во время чтения некоторых данных. Я хочу знать, что происходит с этими списками в этой ситуации:

  1. КлассA имеет список B и список C со многими другими инициализированными объектами внутри.

  2. Другой другой класс получает ссылку на список C из метода класса A, например public List<myObject> GetList().

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

Что происходит с моим списком Cна что ссылается другой объект?Что происходит с классом Object A?

Я пытался пошагово отслеживать сборщик мусора, когда Logcat запускал apk в отладчике, но безуспешно.Иногда это освобождает память, иногда нет, я не могу точно определить какое-либо конкретное поведение.

Ответы [ 3 ]

3 голосов
/ 18 августа 2011

Если есть какой-либо объект, который все еще имеет путь к корню, содержащий ссылку на другой объект, объект, на который имеется ссылка, не будет собираться мусором.Так что, если вы создаете объект A, у него есть подобъект A1.Затем создайте объект B и, что когда-либо означает, передайте ссылку на A1 объекту B. Даже если объект A является GC'd A1, не будет, потому что объект B по-прежнему содержит ссылку.(В вашем примере A & B будет gc'd ... C не будет)

Вы можете поэкспериментировать с механикой сбора мусора, явно указав системе выполнить сбор в определенные моменты времени с помощью System.gc(); звонок.Кроме того, вы можете переопределить объект finalize в объекте, чтобы точно определить, когда данный объект собран.Я бы удалил переопределенный вызов завершения, когда вы закончите тестирование.

3 голосов
/ 18 августа 2011

Объект класса A будет собирать мусор во время следующего цикла GC.Список B тоже будет GC'ed.И Список C не будет GC'ed, потому что это может быть достигнуто от корней GC.

0 голосов
/ 18 августа 2011

По умолчанию java создает объект по ссылке, а не по значению.Таким образом, в этом случае, если сборщик мусора соберет и очистит все ABC, а другой класс, который ссылается на C, будет пустым, поскольку он не создает дублирование класса, он просто ссылается на него.

...