Устройства Android используют разное количество кучи и объема для одного и того же приложения

Мы разработали прототипы NDK для простого проекта. Код компилируется и работает на устройстве и в симуляторе. Однако при просмотре в меню настроек на телефонах: (Samsung Galaxy Nexus (Android 4.2.2), Samsung Gio (Android 2.3.6)), запуск приложения на Gio занимает гораздо больше места, чем когда приложение запускается Galaxy Nexus. Кроме того, следующая команда сообщает о гораздо больших распределениях кучи для GIO:

System.out.println(Debug.getNativeHeapAllocatedSize() / 1049L); 

Мы используем статическую библиотеку для многих функций. Точные результаты:

NEXUS:

  • Footprint (MB) (реализация Java) 1.24
  • Footprint (MB) (реализация C ++ lib) 0.96
  • Распределение памяти (МБ) (реализация Java) 1.6
  • Распределение памяти (MB) (реализация C ++ lib) 1.5

ПИБ:

  • Footprint (MB) (реализация Java) 1.19
  • Footprint (MB) (реализация C ++ lib) 1.71
  • Распределение памяти (МБ) (реализация Java) 4.6
  • Распределение памяти (MB) (реализация C ++ lib) 5.5

В чем причина этой разницы в использовании Footprint и памяти?

(Измерение распределений на устройстве iOS (C ++ lib) дает примерно такой же результат для 3GS, как и у Galaxy Nexus).

Существует множество различий между Android 2.x и Android 4. Примером может служить управление растровой памятью:

На Android Android 2.2 (уровень API 8) и ниже, когда происходит сбор мусора, потоки вашего приложения прекращаются. Это приводит к задержке, которая может ухудшить производительность. Android 2.3 добавляет одновременную сборку мусора, а это означает, что память исправлена ​​вскоре после того, как битмап больше не ссылается.

На Android 2.3.3 (уровень API 10) и ниже данные пикселя подложки для растрового изображения хранятся в собственной памяти. Он отделен от самого растрового изображения, которое хранится в куче Dalvik. Данные пикселов в собственной памяти не выпущены предсказуемым образом, что потенциально может привести к кратковременному превышению пределов памяти и сбоев. Начиная с Android 3.0 (уровень API 11) данные пикселя хранятся в куче Dalvik вместе с соответствующим растровым изображением.

Цитата из: http://developer.android.com/training/displaying-bitmaps/manage-memory.html