4

В моем случае у меня есть функции буксировки, называемые A (Основная деятельность) и B (Child Activity). A запустит B (B, имеющий некоторый файл загрузки изображений с использованием библиотеки изображений Glide).Почему андроид не очищает память после завершения деятельности?

Если я получаю выделение памяти с помощью монитора памяти Android, я могу ясно видеть, как распределение памяти растет. Это совершенно нормально, потому что мы делаем некоторые связанные с изображением вещи в деятельности B.Image Attached.

enter image description here

Так что моя проблема, если я нажал кнопку назад в активности B он придет к активности А и выделенная память не будет cleared.Memory распределения будет по-прежнему в том же количестве.

Это нормальное поведение в андроиде?

Если нет, то как я могу вручную очистить память?

я вручную запустить GC следующим образом, но тот же результат не повезло :(.

В деятельности В

@Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     System.gc(); 
    } 
+1

Насколько я знаю, GC будет работать только и только тогда, когда действительно нужен (не больше места кучи), и все в порядке. В противном случае убедитесь, что абсолютно ничего не ссылается на эту память (проверьте статические ссылки) и убедитесь, что вы очистили некоторые специфические для Android ресурсы. – Spidey

+0

Вы нашли решение? – fish40

ответ

0

1)OnDestroy вызывается, когда finish(); называется, просто нажав кнопку назад выиграл 't вызывать этот метод, если вы не запрограммируете его для этого.

2)System.gc(); в OnDestroy не будет работать, так как ваш activity B все еще активен в onDestroy. Вы должны вызвать это из другой деятельности, как только activity B будет полностью завершен.

3) Активность будет оставаться в памяти, даже если вы вызываете onDestroy, если вы протекаете контекст своей деятельности на долгоживущий объект/нить/и т. Д. (Утечка памяти)

Примечание: вызов System.gc(); не просто освобождает вашу память, он может не выполнять GC в зависимости от ситуации. См. Подробности здесь: Why is it bad practice to call System.gc()?