Сборка мусора фрагмента в 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.


person DennisVA    schedule 12.12.2014    source источник
comment
nullifying an object sets it's reference count to 0. Нет. Он уменьшает счетчик, потому что этой ссылки больше не существует, но могут быть другие ссылки, сохраняющие объект. Также в вашей памяти находятся классы, используемые в объекте, лениво загружаемые, которые не удаляются из памяти. И вы могли бы смотреть на утечку памяти   -  person njzk2    schedule 12.12.2014
comment
возможная копия Java не собирает мусор в памяти   -  person Sarthak Mittal    schedule 12.12.2014
comment
Добавьте сюда код, демонстрирующий проблему. Детали имеют значение, когда дело доходит до сбора мусора.   -  person allTwentyQuestions    schedule 12.12.2014


Ответы (2)


Есть как минимум две причины:

  1. Вы можете предложить сборку мусора, используя System.gc(). Это не принуждает сборку мусора, а просто предлагает это сделать. Оказывается, в виртуальных машинах Android это обычно вызывает ошибку gc.
  2. Что еще более важно, Fragment является управляемым объектом! У вас нет возможности узнать, удалили ли вы все ссылки на контейнер. Пока они все не исчезнут, сборщик мусора не соберет объект.
person G. Blake Meike    schedule 12.12.2014

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

http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#gc%28%29

Ключевое слово здесь «предлагает». Тот факт, что вы вызываете gc, не означает, что среда выполнения вообще должна слушать. Если вы просто аннулируете ссылки, когда закончите их использовать, Java сделает всю работу по очистке за вас.

person John    schedule 12.12.2014