Android 的一些基本概念和OOM异常的处理方法

一些基本的概念

  1. ActivityManagerServices,简称AMS,服务端对象,负责系统中所有的Activity的生命周期

  2. ActivityThread,App的真正入口。当开启App之后,会调用main()开始运行,开启消息循环队列,这就是传说中的UI线程或者叫主线程。与ActivityManagerServices配合,一起完成Activity的管理工作。

  3. ApplicationThread,用来实现ActivityManagerServiceActivityThread之间的交互。在ActivityMangerService需要管理相关Application中的Activity的生命周期时,通过ApplicationThread的代理对象与ActivityThread通讯。

  4. ApplicationThreadProxy,是ApplicationThread在服务器端的代理,负责和客户端的ApplicationThread通讯。AMS就是通过该代理与ActivityThread进行通信的。

  5. Instrumentation,每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation来进行具体的操作。

  6. ActivityStack,Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。

  7. ActivityRecord,ActivityStack的管理对象,每个Activity在AMS对应一个ActivityRecord,来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像。

  8. zygote是什么?有什么作用?
    zygote意为“受精卵”。Android是基于Linux系统的,而在Linux中,所有的进程都是由init进程直接或者是间接fork出来的,zygote进程也不例外。
    在Android系统里面,zygote是一个进程的名字。Android是基于Linux System的,当你的手机开机的时候,Linux的内核加载完成之后就会启动一个叫“init”的进程。在Linux System里面,所有的进程都是由init进程fork出来的,我们的zygote进程也不例外。

我们都知道,每个App其实都是:1)一个单独的dalvik虚拟机 2)一个单独的进程
所以当系统里面的第一个zygote进程运行之后,在这之后再开启App,就相当于开启一个新的进程,而为了实现资源共用和更快的启动速度,Android系统开启新进程的方式,是通过fork第一个zygote进程实现的。所以说,除了第一个zygote进程,其他应用所在的进程都是zygote的子进程,这下你明白为什么这个进程叫“受精卵”了吧?因为就像是一个受精卵一样,它能快速的分裂,并且产生遗传物质一样的细胞!

Android 关于OOM的解决方案

OOM:内存溢出(Out of Memory),也就是说内存占有量超过了VM所分配的最大

出现OOM的原因:

1.加载对象过大
2.相应资源过多,来不及释放

如何解决

1.在内存引用上做些处理,常用的有软引用、强引用、弱引用
2.在内存中加载图片时直接在内存中作处理,比如边界压缩
3.动态回收内存
4.优化Dalvik虚拟机的堆内存分配
5.自定义堆内存的大小

你可能感兴趣的:(总结知识点)