5

我们为一个简单的项目开发了 NDK 原型。该代码已编译并在设备和模拟器上运行。但是,在手机上查看设置菜单时:(Samsung Galaxy Nexus(Android 4.2.2)、Samsung Gio(Android 2.3.6)),在 Gio 上运行应用程序比在运行应用程序时占用更多空间银河系。此外,以下命令报告 GIO 的堆分配更高:

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

我们为很多功能使用了一个静态库。确切的结果是:

关系:

  • 占用空间 (MB)(Java 实现)1.24
  • 占用空间 (MB)(C++ 库实现)0.96
  • 内存分配(MB)(Java实现)1.6
  • 内存分配 (MB)(C++ lib 实现) 1.5

吉奥:

  • 占用空间 (MB)(Java 实现)1.19
  • 占用空间 (MB)(C++ 库实现)1.71
  • 内存分配(MB)(Java实现)4.6
  • 内存分配 (MB)(C++ lib 实现) 5.5

占用空间和内存使用量差异的原因是什么?

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

4

1 回答 1

2

Android 2.x 和 Android 4 之间有很多不同之处。例如,位图内存的管理方式:

在 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

于 2013-04-19T19:01:34.933 回答