关于Android系统中OutOfMemoryError(OOM)原理解析

本文详细探讨了Android应用抛出OutOfMemoryError的触发机制,包括常见和不常见场景,以及内存分配步骤。文章强调了内存管理对性能的影响,并提供了内存优化建议,对开发者极具价值。
摘要由CSDN通过智能技术生成

文章详细分析了Android应用为什么会抛出OutOfMemoryError,以及在哪些情况下会发生这种情况。以下是文章的主要内容概述:

  1. OOM异常的触发:在Java层,只有java.lang.OutOfMemoryError这一个Throwable定义,而抛出这个异常的行为是由JNI层触发的,具体是通过Thread::ThrowOutOfMemoryError函数。

  2. 不常见的OOM情况:文章列举了一些不常见的OOM情况,例如在ClassPreDefine时的MakeSingleDexFIle,通过JNI的NewStringUTF分配超长字符串,JavaUnsafe分配内存失败,以及在创建Java线程时的Thread#start

  3. 常见的OOM情况:文章指出,最常见的OOM发生在堆内存分配过程中,特别是在Heap::AllocateInternalWithGc中。如果在AllocObjectWithAllocator函数里的TryToAllocate分配失败,会尝试进行垃圾回收(GC)后再重新分配。

  4. 内存分配的步骤:文章详细描述了内存分配的步骤,包括在GC进行时等待GC结束、GC结束后尝试分配内存、如果失败再次进行GC但不清除软引用、如果还失败则进行更强力的GC清除软引用等。如果所有尝试都失败,则最终会抛出OOM异常。

  5. 内存优化机制:文章总结了一些内存优化的思路,如减少不合理的内存分配和占用、及时释放内存避免内存泄漏、防止虚拟内存泄漏等。此外,文章还提到了通过inlinehook修改Android 8以下Bitmap的内存分配来减少Java堆内存占用的方法。

  6. 内存管理的重要性:文章强调了内存管理的重要性,指出内存缺乏治理不仅可能导致直接OOM,还可能引发频繁的GC,影响APP的性能指标,如ANR率、Crash率和卡顿。

这篇文章对于Android开发者来说是非常有价值的,因为它不仅解释了OOM的原因和机制,还提供了一些实用的内存优化技巧和建议,有助于开发者更好地管理和优化Android应用的内存使用。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值