Почему разделы "Code" и "Native" в Memory Profiler используют слишком много памяти и как ее уменьшить?

Мое приложение использует 75 МБ памяти, когда пользователь открывает его в первый раз.

Я использовал Android Profiler Tool из Android Studio, чтобы проверить использование памяти моего приложения Android. Когда открывается главный экран, приложение начинает использовать 75 МБ памяти, хотя основное действие не создает объектов, которым требуется слишком много памяти. Нет растровых изображений или больших массивов и т. Д.

40 МБ - из раздела "Код", а 19 МБ - из "Нативного", в который мы не загружаем собственные библиотеки в этом упражнении. Мы загружаемся после того, как пользователь открывает другую активность. Я пытаюсь уменьшить использование памяти, и мне было интересно, как я могу уменьшить из "Код" и "Нативный" раздел.

Скриншот из Android Profiler

1 ответ

Около native использование памяти:

  1. Платформа Android может использовать встроенную память, даже если в вашем приложении 0 встроенного кода, см. Здесь "встроенную" для справки. Например, я просто попытался сделать пример проекта, только один Activity с одним Button и использование собственной памяти составляет 18 МБ, но если я запускаю сборку мусора, она падает до 8 МБ. Чтобы вручную запустить сборку мусора в Android Studio, вы можете щелкнуть значок "мусорное ведро" в левом верхнем углу окна профилировщика памяти. Не стесняйтесь с этой кнопкой, мне обычно приходится нажимать ее много раз подряд, чтобы увидеть падение использования памяти.

  2. Собственная память также может быть выделена из Java без необходимости загружать любую нативную библиотеку с ByteBuffer.allocateDirect(int),

  3. Когда вы говорите, что не загружаете ни одну нативную библиотеку до следующего Activity, если вы загружаете библиотеку статически (в течение static { }) вам не гарантируется, что библиотека будет действительно загружена при запуске второго занятия. Вполне может случиться, что он загружается раньше. Если вы хотите проверить, когда библиотека действительно загружается, вы можете попытаться добавить этот метод в ваш код на C, его следует вызывать, когда ваша библиотека загружается. Это супер грязно, но, эй, это работает. Вы можете записать что-нибудь вместо сбоя.

__attribute__((constructor)) void init(void) { int a = *(int *) ((void *) 0); }

Около code использование памяти, вы должны уменьшить свой код:)

Если вы еще этого не делаете, установите minifyEnabled в true в вашем типе сборки, предполагая, что вы проверяете использование памяти с помощью отладочной сборки:

    ...
    buildTypes {
        debug {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    ...

Также отключите мгновенный запуск (см. "Примечание" здесь).

Другие вопросы по тегам