Сборка мусора из фрагмента в java
Это может быть глупый вопрос, но я мало знаю о сборке мусора. Когда я посмотрел информацию об этом, стало ясно, что обнуление объекта устанавливает его счетчик ссылок на 0, поэтому он становится пригодным для сборки мусора
Итак, я хотел проверить это, и я сделал фрагмент, он использует около 5 МБ памяти. Когда я удаляю фрагмент с помощью менеджера транзакций, обнуляю его и явно вызываю сборщик мусора (GC.collect()), выделенная память остается прежней, и я не получаю 5 МБ обратно.
В чем может быть причина (ы) для этого?
public void Unselect()
{
var ft = this.SupportFragmentManager.BeginTransaction ();
switch (selected)
{
case 8:...
case 9:
//FindViewById (Resource.Id.fragment_container).SetBackgroundDrawable (null);
ft.Hide (carFragment);
ft.Remove (carFragment);
Console.WriteLine ("NULLIFY");
carFragment = null;
break;
case 10:...
}
ft.Commit ();
CarFragment - это фрагмент, содержащий фрагмент поддержки Google Maps V2.
2 ответа
Есть как минимум две причины:
- Вы можете предложить сборку мусора, используя System.gc(). Это не заставляет gc, это только предполагает. Оказывается, что в виртуальных машинах Android это обычно вызывает
- Более важно,
Fragment
это управляемый объект! У вас нет возможности узнать, удалили ли вы все ссылки контейнера. Пока все они не исчезнут, сборщик мусора не будет собирать объект.
Вызов метода gc предполагает, что виртуальная машина Java затрачивает усилия на утилизацию неиспользуемых объектов, чтобы сделать доступной память, которую они занимают, для быстрого повторного использования.
http://docs.oracle.com/javase/7/docs/api/java/lang/System.html
Ключевое слово здесь "предлагает". Только потому что ты звонишь gc
не означает, что Runtime должен слушать вообще. Если вы просто аннулируете ссылки, когда закончите их использовать, Java выполнит за вас работу по очистке.