У меня есть приложение, и я столкнулся с проблемами производительности. Приложение сильно тянет. Я попытался контролировать часть выделения памяти в моей студии Android, и я узнал, почему мое приложение так сильно разбилось. Мое приложение начинается с 19 МБ. Я просматриваю различные действия, а затем нажимаю кнопку «Назад» внутри своего приложения, в котором я звоню finish()
. Я понял, что память была выделена для моих приложений, но даже после завершения вызова память не была освобождена. Я, очевидно, делаю некоторые большие ошибки, но кто-то может указать некоторые причины, почему это может произойти. Я буду очень благодарен. О, да, мое приложение отправилось на 72 МБ. Память так и не была освобождена.Память выделена, но не освобождена при вызове finish() в android
ответ
Вы проверили утечку памяти? Android бы убил process
, но память, выделенная components
, не может быть освобождена GC. Это может произойти из-за наличия ссылки на компоненты или их членов.
В примечании: Android всегда убивает процесс не компонентов. И наша работа заключается в том, чтобы обеспечить сбор мусора (да, GC делает это самостоятельно, но если мы будем ссылаться на какие-либо компоненты, он не получит сбор мусора).
Редактировать 1: вы можете исследовать то же самое, что и подробно here. Или вы можете использовать этот удивительный library by square.
Редактировать 2: например, ваше удерживающее обращение view
в async task
, так что вы сможете его обновить, когда task
отделки. Но пока task
все еще работает, activity
уничтожается из-за поворота экрана. Здесь android
убьет это foreground process
, но GC не сможет собрать выделенную память, потому что async task
держит ссылку view
и, следовательно, активность также не будет получена, потому что view
привязан к ее activity
. И тогда все члены этой деятельности также не будут собраны.
Ну, я попытался посмотреть, не ошибся ли я, но, к сожалению, не смог его найти, но я попробовал это после того, как позвонил, и он освободил много места.
Runtime.getRuntime().gc();
Но я думал, что дс вызывается автоматически, так что если я не права кто-то может сказать мне, если есть какая-либо опасность вызова дса по своему усмотрению, и если не хорошо, то эта линия работала для меня :)
- 1. Память не полностью освобождена
- 2. Память powerbuilder не освобождена
- 3. Dealloc называется, но память не освобождена
- 4. память не освобождена в Matlab?
- 5. Навигационная дуговая память не освобождена
- 6. icu RegexMatcher память не освобождена
- 7. Память от действий не освобождена
- 8. Когда автоматическая память освобождена?
- 9. Будет ли освобождена память?
- 10. Намерение не заканчивается при вызове finish()
- 11. UIView retainCount равно 0, но память не освобождена
- 12. Где выделена динамическая память?
- 13. Память не может быть освобождена в C
- 14. iPhone: память, используемая изображениями, не освобождена
- 15. ClassCastException Исключение при вызове finish() от AsyncTask
- 16. Как утверждать, что память освобождена
- 17. Когда память выделена для программ?
- 18. iOS Память не может быть выделена
- 19. C++ Память не освобождена при удалении указателя на подкласс
- 20. Почему память выделена из компонентовSeparatedByString никогда не выделяется
- 21. Как fmt.Println() память не выделена программой go?
- 22. strcpy отлично работает, хотя память не выделена
- 23. Когда память действительно освобождена в Objective-C?
- 24. Когда память выделена для программы?
- 25. Как проверить, освобождена ли память в Destructor?
- 26. Когда память выделена локальным переменным в C
- 27. Метод Android finish()
- 28. Получение утечки памяти, но выделенная память была освобождена
- 29. Проверьте, освобождена ли память в C
- 30. Свободная память выделена в 3D-матрицу
Да, это единственное объяснение, но как я могу проверить утечку? –
не GC получить вызвал на свой собственный ?? Вы имеете в виду, что я должен сам позвонить в GC? –
Да, GC вызывается сам по себе. Но если вы держите ссылку на какие-либо компоненты, она не будет ее собирать. В этом причина утечки памяти. –