所以Stack空间不需要很大,一般为几MB大小。
- **Heap空间:**使用由程序员控制,程序员可以使用
malloc、new、free、delete等函数
调用来操作这片地址空间。
Heap为程序完成各种复杂任务提供内存空间,所以空间比较大,一般为几百MB到几GB。
正是因为Heap空间由程序员管理,所以容易出现使用不当导致严重问题。
2. 进程内存空间和RAM之间的关系
- 进程的内存空间只是 虚拟内存,而程序的运行需要的是实实在在的内存,即 物理内存(RAM)。
在必要时,操作系统会将程序运行中申请的内存(虚拟内存)映射到RAM,让进程能够使用物理内存。
- 另外,RAM的一部分被操作系统留作他用,比如显存 等等,内存映射和显存等都是由操作系统控制,我们也不必过多地关注它,进程所操作的空间都是虚拟地址空间,无法直接操作RAM 。
3. Android中的进程
-
**native进程:**采用C/C++实现,不包含dalvik实例的linux进程**,
/system/bin/目录
下面的程序文件运行后都是以native进程形式存在的。比如/system/bin/surfaceflinger
、/system/bin/rild
、procrank
等就是native进程。 -
java进程:实例化了dalvik虚拟机实例的linux进程,进程的入口main函数为java函数。 dalvik虚拟机实例的宿主进程是fork()系统调用创建的linux进程,所以每一个**Android上的java进程实际上就是一个linux进程,只是进程中多了一个dalvik虚拟机实例。**因此,java进程的内存分配比native进程复杂。Android系统中的应用程序基本都是java进程,如
桌面
、电话
、联系人
、状态栏
等等。
4. Android中进程的堆内存
- heap空间 完全由程序员控制,我们使用
malloc
、C++ new
和java 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系统能同时让比