Android OOM:内存管理分析和内存泄露原因总结,架构师必备

本文详细探讨了Android应用中内存管理,尤其是Java程序为何易发生OOM异常,以及Android如何应对RAM不足。讲解了Dalvik的垃圾回收机制,并列举了常见的内存泄漏场景,包括非静态内部类的静态实例、Activity使用静态成员、Handler的内存问题等,为开发者提供了避免内存泄漏的建议。
摘要由CSDN通过智能技术生成

所以Stack空间不需要很大,一般为几MB大小。

  • **Heap空间:**使用由程序员控制,程序员可以使用malloc、new、free、delete等函数调用来操作这片地址空间。

Heap为程序完成各种复杂任务提供内存空间,所以空间比较大,一般为几百MB到几GB。

正是因为Heap空间由程序员管理,所以容易出现使用不当导致严重问题。

2. 进程内存空间和RAM之间的关系
  • 进程的内存空间只是 虚拟内存,而程序的运行需要的是实实在在的内存,即 物理内存(RAM)

在必要时,操作系统会将程序运行中申请的内存(虚拟内存)映射到RAM,让进程能够使用物理内存。

  • 另外,RAM的一部分被操作系统留作他用,比如显存 等等,内存映射和显存等都是由操作系统控制,我们也不必过多地关注它,进程所操作的空间都是虚拟地址空间,无法直接操作RAM
3. Android中的进程
  1. **native进程:**采用C/C++实现,不包含dalvik实例的linux进程**,/system/bin/目录下面的程序文件运行后都是以native进程形式存在的。比如/system/bin/surfaceflinger/system/bin/rildprocrank等就是native进程。

  2. java进程:实例化了dalvik虚拟机实例的linux进程,进程的入口main函数为java函数。 dalvik虚拟机实例的宿主进程是fork()系统调用创建的linux进程,所以每一个**Android上的java进程实际上就是一个linux进程,只是进程中多了一个dalvik虚拟机实例。**因此,java进程的内存分配比native进程复杂。Android系统中的应用程序基本都是java进程,如桌面电话联系人状态栏等等。

4. Android中进程的堆内存
  • heap空间 完全由程序员控制,我们使用mallocC++ newjava new所申请的空间都是heap空间, C/C++申请的内存空间在native heap中,而java申请的内存空间则在dalvik heap中。
5. Android的 java程序为什么容易出现OOM
  • 因为Android系统对dalvik的vm heapsize作了硬性限制,当java进程申请的java空间超过阈值时,就会抛出OOM异常(这个阈值可以是48M、24M、16M等,视机型而定),可以通过adb shell getprop | grep dalvik.vm.heapgrowthlimit 查看此值。

  • 也就是说,程序发生OMM并不表示RAM不足,而是因为程序申请的java heap对象超过了dalvik vm heapgrowthlimit。也就是说,在RAM充足的情况下,也可能发生OOM。

  • 这样设计的 目的是为了让Android系统能同时让比

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值