alekseyHunter
@alekseyHunter
Android developer

Как работает сборщик мусора с объектами?

Интересуют особенности очистки памяти сборщиком мусора, а именно как он ведет себя с объектами, переданными в функции.
Пример #1.1:
val ft = supportFragmentManager.beginTransaction()
var fragment = ListObjectsFragment()
ft.replace(R.id.fragment_container, fragment, LIST_OBJECTS_FRAGMENT)
ft.commit()

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

Пример #1.2:
val ft = supportFragmentManager.beginTransaction()
var fragment: Fragment?
fragment = ListObjectsFragment()
ft.replace(R.id.fragment_container, fragment, LIST_OBJECTS_FRAGMENT)
ft.commit()
fragment = null

Объект будет помечен сборщиком мусора после коммита.

Пример #2:
val ft = supportFragmentManager.beginTransaction()
ft.replace(R.id.fragment_container, ListObjectsFragment(), LIST_OBJECTS_FRAGMENT)
ft.commit()

Объект будет помечен сборщиком мусора сразу, поскольку на него нет ссылки.

Можно вызвать самостоятельно сборщик мусора, но тогда приложение может зависнуть на пару секунд, а можно подождать вызов от системы. Получается, что разницы в объявлении объекта нет?
  • Вопрос задан
  • 137 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Рассуждения неверные. Читай код FragmentManager'a. Ни в одном из случаев объект не будет помечен, удалён, и тд. Ссылка на него останется в транзакции.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы