2016-03-24 4 views
0

У меня есть приложение, и я столкнулся с проблемами производительности. Приложение сильно тянет. Я попытался контролировать часть выделения памяти в моей студии Android, и я узнал, почему мое приложение так сильно разбилось. Мое приложение начинается с 19 МБ. Я просматриваю различные действия, а затем нажимаю кнопку «Назад» внутри своего приложения, в котором я звоню finish(). Я понял, что память была выделена для моих приложений, но даже после завершения вызова память не была освобождена. Я, очевидно, делаю некоторые большие ошибки, но кто-то может указать некоторые причины, почему это может произойти. Я буду очень благодарен. О, да, мое приложение отправилось на 72 МБ. Память так и не была освобождена.Память выделена, но не освобождена при вызове finish() в android

ответ

1

Вы проверили утечку памяти? 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. И тогда все члены этой деятельности также не будут собраны.

+0

Да, это единственное объяснение, но как я могу проверить утечку? –

+0

не GC получить вызвал на свой собственный ?? Вы имеете в виду, что я должен сам позвонить в GC? –

+0

Да, GC вызывается сам по себе. Но если вы держите ссылку на какие-либо компоненты, она не будет ее собирать. В этом причина утечки памяти. –

0

Ну, я попытался посмотреть, не ошибся ли я, но, к сожалению, не смог его найти, но я попробовал это после того, как позвонил, и он освободил много места.

Runtime.getRuntime().gc(); 

Но я думал, что дс вызывается автоматически, так что если я не права кто-то может сказать мне, если есть какая-либо опасность вызова дса по своему усмотрению, и если не хорошо, то эта линия работала для меня :)

Смежные вопросы