1. 程式人生 > >Android 的一些基本概念和OOM異常的處理方法

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.自定義堆記憶體的大小