Android 的一些基本概念和OOM異常的處理方法
一些基本的概念
ActivityManagerServices,簡稱AMS,服務端物件,負責系統中所有的Activity的生命週期
ActivityThread,App的真正入口。當開啟App之後,會呼叫main()開始執行,開啟訊息迴圈佇列,這就是傳說中的UI執行緒或者叫主執行緒。與ActivityManagerServices配合,一起完成Activity的管理工作。
ApplicationThread,用來實現ActivityManagerServiceActivityThread之間的互動。在ActivityMangerService需要管理相關Application中的Activity的生命週期時,通過ApplicationThread的代理物件與ActivityThread通訊。
ApplicationThreadProxy,是ApplicationThread在伺服器端的代理,負責和客戶端的ApplicationThread通訊。AMS就是通過該代理與ActivityThread進行通訊的。
Instrumentation,每一個應用程式只有一個Instrumentation物件,每個Activity內都有一個對該物件的引用。Instrumentation可以理解為應用程序的管家,ActivityThread要建立或暫停某個Activity時,都需要通過Instrumentation來進行具體的操作。
ActivityStack,Activity在AMS的棧管理,用來記錄已經啟動的Activity的先後關係,狀態資訊等。通過ActivityStack決定是否需要啟動新的程序。
ActivityRecord,ActivityStack的管理物件,每個Activity在AMS對應一個ActivityRecord,來記錄Activity的狀態以及其他的管理資訊。其實就是伺服器端的Activity物件的映像。
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.自定義堆記憶體的大小