Android-приложение использует больше оперативной памяти, чем максимальный размер кучи на некоторых телефонах

У меня есть приложение, которое нормально работает на большинстве телефонов (например, Nexus **): использование памяти никогда не превышает 24 МБ. Но на моем Sony Ericsson Xperia Arc после нескольких дней работы он использует более 70 МБ ОЗУ (согласно Настройки-> Приложения-> Запущенные службы).

Runtime.getRuntime().maxMemory() говорит, что максимальный размер кучи моего телефона составляет всего 32 МБ.

Есть ли способ узнать, что происходит с моим приложением на этом телефоне?

Вот adb meminfo для этого приложения:

C:\>adb -d shell dumpsys meminfo 4606
Applications Memory Usage (kB):
Uptime: 409334045 Realtime: 585217200

** MEMINFO in pid 4606 [com.*****************] **
                    native   dalvik    other    total
            size:    60796    10695      N/A    71491
       allocated:    54057     6091      N/A    60148
            free:     6706     4604      N/A    11310
           (Pss):    56549     1129     8385    66063
  (shared dirty):     2128     1304     4964     8396
    (priv dirty):    56496      892     8156    65544

 Objects
           Views:        0        ViewRoots:        0
     AppContexts:        0       Activities:        0
          Assets:        3    AssetManagers:        3
   Local Binders:        5    Proxy Binders:       14
Death Recipients:      222
 OpenSSL Sockets:        2

 SQL
               heap:      425         MEMORY_USED:      425
 PAGECACHE_OVERFLOW:       81         MALLOC_SIZE:       50

 DATABASES
      pgsz     dbsz   Lookaside(b)  Dbname
         1       54            223  *.db
         1       27            198  **.db
         1        5             24  ***.db
         1       11             56  ****.db

C:\>

person Qi Fan    schedule 19.10.2011    source источник


Ответы (1)


Использование памяти машинным кодом не ограничено размером кучи Java, поэтому приложения могут легко превысить этот предел. Хотя это означает, что Android с большей вероятностью убьет ваше приложение, когда оно находится в фоновом режиме, это не должно быть проблемой, если вы не превысите доступную оперативную память на устройстве.

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

При этом 70 МБ не о чем беспокоиться на современных устройствах. Вы должны быть в безопасности на большинстве телефонов, так как вы придерживаетесь менее ~ 150 МБ.

person Aaron C    schedule 20.10.2011
comment
Через полдня он достиг 85 МБ, и в следующий раз, когда я проверил, он был убит системой (использование ОЗУ снизилось до 20 МБ, а PID был изменен). - person Qi Fan; 20.10.2011
comment
Я получаю комментарий о том, что рынок говорит, что это приложение занимает более 150 МБ на его телефоне. - person Qi Fan; 20.10.2011