Взгляните на это: BackStackRecord.Op.fragment
Так фрагменты хранятся в заднем стеке. Обратите внимание на реальную ссылку, там не используются ни WeakReference
, ни SoftReference
.
Теперь это: FragmentManagerImpl.mBackStack
Здесь менеджер хранит задний стек. Простой ArrayList
, также без WR или SR.
И, наконец, это: Activity.mFragments
Это ссылка на менеджер фрагментов.
GC может собирать только те объекты, которые не имеют живых ссылок (недоступных из какого-либо потока). Это означает, что до тех пор, пока ваша активность не будет уничтожена (и, таким образом, ссылка FragmentManager
исчезнет), GC не сможет собрать ни один из фрагментов в заднем стеке .
Обратите внимание, что когда действие уничтожается и сохраняет состояние (как при переключении устройства в альбомный режим), оно не сохраняет фактические Fragment
объекты в стеке, только их состояния - Fragment.FragmentState объекты, то есть фактические фрагменты в заднем стеке воссоздаются каждый раз, когда деятельность воссоздается с сохраненным состоянием.
Надеюсь, это поможет.
PS Итак, вкратце: Да, вы можете исчерпать память, добавив Fragments
в стек , а также добавив слишком много представлений для просмотра иерархии.
UPD Учитывая ваш пример, F будет оставаться в памяти до тех пор, пока C не будет уничтожен. Если C убит, а затем воскрешен с другой конфигурацией - F будет уничтожен и реинкарнирован в другом объекте. Таким образом, F занимает объем памяти до тех пор, пока C не потеряет состояние или не будет очищен задний стек.