The Android framework enforces a per-process 24 MB memory limit. On some older devices, such as the G1, the limit is even lower at 16 MB.

What’s more, the memory used by Bitmaps is included in the limit. For an application manipulating images it is pretty easy to reach this limit and get the process killed with an OOM exception:

E/dalvikvm-heap(12517): 1048576-byte external allocation too large for this process.

E/GraphicsJNI(12517): VM won't let us allocate 1048576 bytes

D/AndroidRuntime(12517): Shutting down VM

W/dalvikvm(12517): threadid=1: thread exiting with uncaught exception (group=0x4001d7f0)

E/AndroidRuntime(12517): FATAL EXCEPTION: main

E/AndroidRuntime(12517): java.lang.OutOfMemoryError: bitmap size exceeds VM budget

This limit is ridiculously low. For a device, like the Nexus One, with 512MB of physical RAM, setting the per-process memory limit for the foreground activity to only 5% of the RAM is a silly mistake. But anyway, that’s how things are and we have to live with it — i.e. find how to work around it.

There are two ways to allocate much more memory than the limit:

One way is to allocate memory from native code. Using the NDK (native development kit) and JNI, it’s possible to allocate memory from the C level (e.g. malloc/free or new/delete), and such allocations are not counted towards the 24 MB limit. It’s true, allocating memory from native code is not as convenient as from Java, but it can be used to store some large amounts of data in RAM (even image data).

Another way, which works well for images, is to use OpenGL textures — the texture memory is not counted towards the limit.

To see how much memory your app has really allocated you can use android.os.Debug.getNativeHeapAllocatedSize().

Using either of the two techniques presented above, on a Nexus One, I could easily allocate 300MB for a single foreground process — more than 10 times the default 24 MB limit.

从上面来看使用navtive code分配内存是不在24MB的限制内的(open GL的texture也是使用navtive code分配内存的)。

更多相关文章

  1. AIR Native Extension的使用(Android)二 : Flex mobile项目中使
  2. Android尺寸单位
  3. Android中WebView使用规范
  4. 3.1如何编写程序界面&3.2常见控件使用方法
  5. (Android(安卓)Studio 3.0)Android(安卓)Profiler内存泄漏检查
  6. android studio使用错误排查记录
  7. 箭头函数的基础使用
  8. NPM 和webpack 的基础使用
  9. Python list sort方法的具体使用

随机推荐

  1. 最强 Android(安卓)Studio 使用小技巧和
  2. Android(Kotlin版本)MVC框架的实例以及代码
  3. android lru缓存 辅助类LruCache源码解析
  4. Android与服务器交互
  5. Android(安卓)调试桥(adb)
  6. Android开发指南-三维图形
  7. Android(安卓)7 新特性浅析
  8. Android(安卓)修改系统屏幕亮度及监听
  9. Android(安卓)中报错 W/System.err: andr
  10. Android中的AsyncTask原理