Android 内存的一些小知识点

首先了解一下堆(Heap)和栈(Stack)

  百度百科:在计算机领域中,堆栈是一个不容忽视的概念,堆栈都是一种数据项按序排列的数据结构,只能在一端对数据项进行插入和删除。要点:,队列优先,先进先出(FIFO);,后进先出(FILO)。
    
  Stack空间(进栈和出栈)由操作系统控制,主要存储函数地址、函数参数、局部变量等等,所以Stack空间不需要很大。


  Heap空间由程序控制,程序员可以操作这片地址空间。Heap为程序完成各种复杂任务提供内存空间,所以空间比较大。正是因为Heap空间由程序员管理,所以容易出现使用不当导致严重问题。


Android里的Native内存和Dalvik内存

  Android里的进程一般有两种:native进程(采用C/C++实现)和java进程(Android中运行于dalvik虚拟机上的进程)。dalvik虚拟机的宿主进程由fork()系统调用创建,所以每一个java进程都是存在于一个native进程中。


  dalvik内存:是指dalvik虚拟机所使用的内存。
  native内存:是被native使用的内存。应该指使用C\C++分配的内存。


  我们一般只需要关心Android中进程的堆(Heap)内存。因为上面已经提过,heap空间才是完全由我们程序员控制的的,我们使用的malloc、C++ new和java new所申请的空间都是heap空间, C/C++申请的内存空间在native heap中,而java申请的内存空间则在dalvik heap中。


  这里我们用一张图大致看一下我们实际开发中申请的数据的存放位置:
这里写图片描述


  不过需要注意的是:虽然Bitmap对象是使用java native方法创建的,但是其实它会被分配到dalvik heap中,所以过多地创建bitmap对象会导致OOM异常,这是因为Android系统对dalvik的vm heapsize做了硬性限制,当java进程申请的java空间超过阈值时,就会抛出OOM异常(这个阈值可以是48M、24M、16M等,视机型而定)。


参考:

  1. 浅谈Android内存管理

猜你喜欢

转载自blog.csdn.net/qq_21700489/article/details/78727855