Android内存管理
APP默认分配内存大小
在Android里,程序内存被分为2部分:
- native
- dalvik
android程序内存(native+dalvik)一般限制在16M,或者24M,36M
gDvm.heapSizeStart = 2 * 1024 * 1024; // heap初始化大小为2M
gDvm.heapSizeMax = 16 * 1024 * 1024; // 最大的heap为16M
dalvik的堆栈内存
|Heap(堆)|Stack(栈)
---|---|---|
dalvik作用|dalvik大内存数据区|dalvik内存指令区
数据存储|对象实例数据 方法内部变量(复杂类型) 动态属性|基本数据类型 方法内部变量(简单数据变量) 静态属性 类方法 对象地址 常量
-
堆
堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分 配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
-
栈
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本 类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。
Android的GC如何回收内存
Android的一个应用程序的内存泄露对别的应用程序影响不大。为了能够使得Android应用程序安全且快速的运行,Android的每个应用程序都 会使用一个专有的Dalvik虚拟机实例来运行,它是由Zygote服务进程孵化出来的,也就是说每个应用程序都是在属于自己的进程中运行的。 Android为不同类型的进程分配了不同的内存使用上限,如果程序在运行过程中出现了内存泄漏的而造成应用进程使用的内存超过了这个上限,则会被系统视 为内存泄漏,从而被kill掉,这使得仅仅自己的进程被kill掉,而不会影响其他进程(如果是system_process等系统进程出问题的话,则会 引起系统重启)。
Android系统在运行多个进程时,如果系统资源不足,会强制结束一些进程。优先选择哪个进程来结束是有优先级的。
进程的优先级:
1.Foreground process 前台进程
用户可见,可以操作. 按钮可以点击(获取焦点) onResume方法被调用了.2.Visible process 可见进程 可视进程
onpause方法被调用 但是activity任然界面可见.3.Service process 服务进程.
系统会延长维护服务进程存活的周期,直到前台进程和可见进程内存不够用4.Background process 后台进程
开启了activity后 最小化了.5.Empty process 空进程
没有任何组件运行的进程 开启了activity之后,关闭了