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分配内存的)。
分享到:
相关推荐
在Android系统中,开发者可以通过Android提供的API来获取系统的内存信息以及正在运行的进程状态。这一功能主要涉及到`ActivityManager`类的使用。`ActivityManager`是Android SDK中的一个关键组件,它提供了对系统...
我们创建的对象是在这里面分配的,对于内存的限制是 native+dalvik 不能超过最大限制. Android 原生系统一般默认16M,但是国内手机一般都是特殊定制的,都有修改系统的内存大小,所有有时候,要查看具体应用系统分配的...
首先,理解Android进程的生命周期和优先级至关重要。Android系统根据各个应用组件所处的进程的重要性,将其分为多个等级,包括前台进程、可见进程、重要服务进程、后台进程和服务进程。优先级越高,系统在内存不足时...
文档中提到的“3528000-byte external allocation too large for this process”,意味着尝试分配一个超过虚拟机给定进程内存限制的外部资源。 6. Android错误日志分析:文档包含了一些错误日志,它们记录了应用...
Android设备的默认最大堆内存限制通常是16MB,但不同设备可能有所不同。 - **栈(Stack)**:栈内存用于存储基本类型变量(如int、float等)、对象引用和方法调用时的局部变量。栈内存分配速度快,但由于其大小和...
本文将深入探讨如何使用MarsDaemon源码实现Android进程及Service的常驻,确保服务即使在用户退出应用或者系统清理内存时也能持续运行。 首先,了解Android的进程生命周期是至关重要的。Android系统为了优化资源管理...
二、Android进程与服务 1. 进程生命周期:Android系统为了优化资源管理,会根据需要杀死后台进程。服务(Service)是后台运行的组件,但并不能保证进程不会被杀死。 2. 长期运行服务:通过实现`IntentService`或...
尽管可以通过`ActivityManager`获取进程信息,但请注意,Android系统可能会根据内存状况杀死后台进程,所以获取到的进程列表并不一定完整。此外,对于非系统应用,获取其他应用的详细信息(尤其是敏感的后台信息)...
在Android平台上,获取CPU、内存和磁盘使用率信息对于开发者来说是十分重要的,这有助于监控设备性能,优化应用运行,以及提供用户友好的反馈。然而,由于Android系统的安全机制,不同的权限级别决定了你能获取到何...
- **限制应用进程的内存使用**:了解并遵守Android对不同进程级别的内存限制。 通过以上策略和实践,开发者可以有效地预防和解决Android应用中的内存溢出问题,提升应用的稳定性和性能。同时,持续学习和关注...
在Android平台上,WebView是一个至关重要的组件,它允许开发者在应用程序中嵌入网页内容。然而,随着Web技术的不断发展,WebView的复杂性和需求也在增加,这可能导致兼容性问题和内存泄漏。为了解决这些问题,...
本文将深入探讨Android Bitmap内存限制以及如何避免OOM错误。 首先,我们需要理解引发上述错误的原因。当Android系统尝试分配一块超过其当前可用内存大小的内存时,会抛出`java.lang.OutOfMemoryError: bitmap size...
虽然理论上可以传递基本数据类型、String以及`Parcelable`等类型,但在实际操作中可能会遇到限制。例如,给定的内容中提到,虽然理论上可以传递`Bundle`,但在Eclipse环境中可能会遇到兼容性问题。 - 当使用Eclipse...
- 由于内存限制,尽量不要在AIDL接口中传递大量数据。 - 使用弱引用管理服务的Binder引用,防止内存泄漏。 9. **实例应用** AIDL常用于实现服务的远程调用,例如音乐播放服务、下载服务等,可以让多个应用程序...
避免内存泄漏**:及时释放资源,避免因内存泄漏导致服务所在的进程被系统误认为是无用进程。 **8. 合理使用Service生命周期方法**:如onStartCommand()和onDestroy(),确保服务在合适的时候被启动和停止。 需要...
每个Android应用运行在一个独立的Linux进程中,当应用退出时,其分配的内存会随之释放。然而,如果存在无用的引用,导致对象无法被GC回收,就会产生内存泄漏。内存泄漏可能会占用宝贵的内存资源,限制系统能够同时...
3. **内存限制**:Android系统对应用的内存使用有严格限制,超出限制将导致应用被系统强制关闭。 4. **设备差异性**:由于Android设备型号众多,内存规格不一,设计解决方案时需考虑最广泛的兼容性。 #### 解决方案...
- 理解Android系统的内存限制,不同设备和API级别的差异。 - 避免一次性加载大量数据,比如大图的加载和缓存策略。 - 使用Bitmap的高效使用方式,如缩放、配置合适的图片格式和质量。 4. **对象池和复用**: - ...
原生层内存则受到原生进程内存限制的约束。 要查看Android设备对App的内存限制,可以通过adb命令行工具查看 `/system/build.prop` 文件,或者在代码中利用`ActivityManager`的`getMemoryClass()`方法。另外,虽然...