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

Dav*_*son 5 heap android memory-management allocation

我们为一个简单的项目开发了NDK原型.代码在设备和模拟器中编译和工作.然而,当查看手机上的设置菜单时:(三星Galaxy Nexus(Android 4.2.2),三星Gio(Android 2.3.6)),在Gio上运行应用程序比运行应用程序时占用更多空间Galaxy Nexus.此外,以下命令报告GIO的堆分配要高得多:

System.out.println(Debug.getNativeHeapAllocatedSize() / 1049L);
Run Code Online (Sandbox Code Playgroud)

我们使用静态库来实现许多功能.确切的结果是:

关系:

  • 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)在3GS上产生与Galaxy Nexus大致相同的结果).

Mat*_*der 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 级别 11)开始,像素数据与关联的位图一起存储在 Dalvik 堆上。

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