Android设备是否为同一个应用程序使用不同数量的堆和占用空间

时间:2013-04-15 11:35:43

标签: android memory-management heap allocation

我们为一个简单的项目开发了NDK原型。代码在设备和模拟器中编译和工作。然而,当查看手机上的设置菜单时:(三星Galaxy Nexus(Android 4.2.2),三星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
  • 内存分配(MB)(Java实现)1.6
  • 内存分配(MB)(C ++ lib实现)1.5

GIO:

  • Footprint(MB)(Java实现)1.19
  • Footprint(MB)(C ++ lib实现)1.71
  • 内存分配(MB)(Java实现)4.6
  • 内存分配(MB)(C ++ lib实现)5.5

足迹和内存使用量差异的原因是什么?

(测量iOS设备(C ++ lib)上的分配产生的结果与Galaxy Nexus上的结果大致相同)。

1 个答案:

答案 0 :(得分:2)

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 Level 11),像素   数据与关联的位图一起存储在Dalvik堆上。

引自: http://developer.android.com/training/displaying-bitmaps/manage-memory.html