`
berdy
  • 浏览: 513254 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

如何避免android上的进程的内存限制

阅读更多
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 楼 shadow_1984 2011-11-04  
请问上面的那些文字是google官方的么?

相关推荐

    Android中获取系统内存信息以及进程信息

    在Android系统中,开发者可以通过Android提供的API来获取系统的内存信息以及正在运行的进程状态。这一功能主要涉及到`ActivityManager`类的使用。`ActivityManager`是Android SDK中的一个关键组件,它提供了对系统...

    Android获取当前应用分配的最大内存和目前使用内存的方法

    我们创建的对象是在这里面分配的,对于内存的限制是 native+dalvik 不能超过最大限制. Android 原生系统一般默认16M,但是国内手机一般都是特殊定制的,都有修改系统的内存大小,所有有时候,要查看具体应用系统分配的...

    Android-提高android服务进程的优先级

    首先,理解Android进程的生命周期和优先级至关重要。Android系统根据各个应用组件所处的进程的重要性,将其分为多个等级,包括前台进程、可见进程、重要服务进程、后台进程和服务进程。优先级越高,系统在内存不足时...

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY.pdf

    文档中提到的“3528000-byte external allocation too large for this process”,意味着尝试分配一个超过虚拟机给定进程内存限制的外部资源。 6. Android错误日志分析:文档包含了一些错误日志,它们记录了应用...

    Android 内存溢出问题

    Android设备的默认最大堆内存限制通常是16MB,但不同设备可能有所不同。 - **栈(Stack)**:栈内存用于存储基本类型变量(如int、float等)、对象引用和方法调用时的局部变量。栈内存分配速度快,但由于其大小和...

    Android 实现进程及Service常驻之MarsDaemon源码

    本文将深入探讨如何使用MarsDaemon源码实现Android进程及Service的常驻,确保服务即使在用户退出应用或者系统清理内存时也能持续运行。 首先,了解Android的进程生命周期是至关重要的。Android系统为了优化资源管理...

    Android JNI 进程保活

    二、Android进程与服务 1. 进程生命周期:Android系统为了优化资源管理,会根据需要杀死后台进程。服务(Service)是后台运行的组件,但并不能保证进程不会被杀死。 2. 长期运行服务:通过实现`IntentService`或...

    Android 低版本和高版本获取后台运行进程

    尽管可以通过`ActivityManager`获取进程信息,但请注意,Android系统可能会根据内存状况杀死后台进程,所以获取到的进程列表并不一定完整。此外,对于非系统应用,获取其他应用的详细信息(尤其是敏感的后台信息)...

    Android获取cpu,内存,磁盘使用率信息

    在Android平台上,获取CPU、内存和磁盘使用率信息对于开发者来说是十分重要的,这有助于监控设备性能,优化应用运行,以及提供用户友好的反馈。然而,由于Android系统的安全机制,不同的权限级别决定了你能获取到何...

    Android防止内存溢出浅析.zip

    - **限制应用进程的内存使用**:了解并遵守Android对不同进程级别的内存限制。 通过以上策略和实践,开发者可以有效地预防和解决Android应用中的内存溢出问题,提升应用的稳定性和性能。同时,持续学习和关注...

    android与WebView进程通信

    在Android平台上,WebView是一个至关重要的组件,它允许开发者在应用程序中嵌入网页内容。然而,随着Web技术的不断发展,WebView的复杂性和需求也在增加,这可能导致兼容性问题和内存泄漏。为了解决这些问题,...

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY[文].pdf

    本文将深入探讨Android Bitmap内存限制以及如何避免OOM错误。 首先,我们需要理解引发上述错误的原因。当Android系统尝试分配一块超过其当前可用内存大小的内存时,会抛出`java.lang.OutOfMemoryError: bitmap size...

    Android开发中实现跨进程通讯

    虽然理论上可以传递基本数据类型、String以及`Parcelable`等类型,但在实际操作中可能会遇到限制。例如,给定的内容中提到,虽然理论上可以传递`Bundle`,但在Eclipse环境中可能会遇到兼容性问题。 - 当使用Eclipse...

    Android使用AIDL实现跨进程通信

    - 由于内存限制,尽量不要在AIDL接口中传递大量数据。 - 使用弱引用管理服务的Binder引用,防止内存泄漏。 9. **实例应用** AIDL常用于实现服务的远程调用,例如音乐播放服务、下载服务等,可以让多个应用程序...

    android 进程保活

    避免内存泄漏**:及时释放资源,避免因内存泄漏导致服务所在的进程被系统误认为是无用进程。 **8. 合理使用Service生命周期方法**:如onStartCommand()和onDestroy(),确保服务在合适的时候被启动和停止。 需要...

    Android应用程序如何避免内存泄漏

    每个Android应用运行在一个独立的Linux进程中,当应用退出时,其分配的内存会随之释放。然而,如果存在无用的引用,导致对象无法被GC回收,就会产生内存泄漏。内存泄漏可能会占用宝贵的内存资源,限制系统能够同时...

    针对Android应用中Gallery内存溢出的解决方案.pdf

    3. **内存限制**:Android系统对应用的内存使用有严格限制,超出限制将导致应用被系统强制关闭。 4. **设备差异性**:由于Android设备型号众多,内存规格不一,设计解决方案时需考虑最广泛的兼容性。 #### 解决方案...

    android 优化内存方案

    - 理解Android系统的内存限制,不同设备和API级别的差异。 - 避免一次性加载大量数据,比如大图的加载和缓存策略。 - 使用Bitmap的高效使用方式,如缩放、配置合适的图片格式和质量。 4. **对象池和复用**: - ...

    Android内存OOM优化详解.pdf

    原生层内存则受到原生进程内存限制的约束。 要查看Android设备对App的内存限制,可以通过adb命令行工具查看 `/system/build.prop` 文件,或者在代码中利用`ActivityManager`的`getMemoryClass()`方法。另外,虽然...

Global site tag (gtag.js) - Google Analytics