999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Android內存管理機制研究

2015-12-20 11:06:53宋平波李云楊豪杰
移動通信 2015年7期
關鍵詞:進程機制系統

宋平波,李云,楊豪杰

(中國電信股份有限公司廣東研究院,廣東 廣州 510630)

Android內存管理機制研究

宋平波,李云,楊豪杰

(中國電信股份有限公司廣東研究院,廣東 廣州 510630)

本文深入分析了Android操作系統的內存管理機制以及內存回收機制,并針對Android應用開發者提出了有效可實施的建議。

Android 內存管理 內存回收

1 引言

伴隨國內4G的啟動以及各大運營商移動互聯網流量經營的不斷深入,移動互聯網應用將再次迎來飛速增長,移動APP將進一步滲入用戶的基本生活,中國電信也在移動互聯網應用方面做了大量研發工作。鑒于移動終端操作系統在資源分配、管理以及回收上對應用有著更為嚴格的限制,為了能夠使移動APP高效穩定的運行,APP開發人員有必要深入了解移動終端操作系統的內存管理機制,并根據操作系統的限制,合理使用內存空間,避免被操作系統強殺,提高APP的可靠性。

2 Android內存管理機制

2.1 Android與Linux

Android系統是Google在Linux內核基礎上開發,針對移動設備進行了特殊優化的開源操作系統。特別是在內存管理機制上,針對移動終端資源特點及移動APP應用特點進行了優化,當進程活動停止后,Android不會立刻結束這個進程,而是將進程保留在內存中,當用戶嘗試再次激活此進程時,可以直接復用內存中的數據從而提升進程的啟動速度,當系統需要更多內存時,Android才會將這些進程占用的內存釋放。

同樣,繼承自Linux的Android操作系統也可以通過系統命令“cat/proc/meminfo”查看內存使用情況,如圖1所示。其中,MemTotal:總的可用內存;MemFree:未被分配空閑的內存;Buffers:buffer的大小;Cached:cache的大小;SwapCached:swap緩存的大小,Android很少使用swap,經常為0。

2.2 Android進程回收(LMK)

(1)進程回收優先級

1)進程優先級及oom_adj

Android是一個多任務系統,即可以同時運行多個程序。操作系統啟動運行一個程序是需要一定系統開銷(CPU、時間等)的。因此,如在2.1節中提到,為了應用再次啟動時的啟動速度,當用戶退出一個程序后,Android操作系統仍然會將這個程序保留在內存中,當程序再次被啟動時就可以快速啟動。當系統內存出現不足時,Android系統會按照一定的優先級,對運行中的程序進行回收,以釋放內存。

圖1 Android手機內存使用情況

如圖2所示,Android操作系統將運行中的進程分為6類,并在內存不足時按照空進程(EMPTY_APP)、內容供應節點(CONTENT_PROVIDER)、后臺進程(HIDDEN_APP)、次要服務進程(SECONDARY_ SERVER)、可視進程(VISIBLE_APP)和前臺進程(FOREGROUND_APP)的順序,逐一對進程進行回收。

圖2 Android進程分類

Android操作系統為每個進程維護一個oom_adj值,一進程的oom_adj值也就代表了它的優先級,oom_adj值越高代表該進程優先級越低。各進程含義及oom_adj值如下:

◆前臺進程(FOREGROUND)oom_adj:0

用戶在屏幕上可見的應用程序進程,同時也包括(可能不可見的)系統進程或電話服務進程。最為直接的例子就是用戶正在使用的應用程序進程就是前臺進程,而前臺進程的優先級最高,也最不容易被系統回收。

◆可見進程(VISIBLE)oom_adj:1

應用程序仍然可見,但是已經不是前臺進程的應用進程。比如:當某個前臺應用程序被另外一個應用程序的通知遮蓋了一部分(通知通常在屏幕正中,但周邊仍然能見到原來的應用程序),這時此應用程序進程由前臺進程轉為了可見進程。可見進程的優先級仍然較高,僅次于前臺進程。

◆次要服務(SECONDARY SERVER)進程oom_adj:2

次要服務指的是系統后臺正在運行的服務進程(包括系統桌面、UI等服務,但電話、系統底層服務等主要服務不在此列,因此命名為次要服務)。后臺運行(不可見)的包含服務的應用進程是次要服務的主要組成部分,次要服務的優先級低于可見進程。

◆后臺進程(HIDDEN)oom_adj:7

后臺進程指的是不可見的且不包含服務,但仍在運行的應用進程。當用戶返回桌面時,之前用戶正在使用的應用程序如果不包含服務,則此應用程序變為后臺進程。

◆內容供應節點(CONTENT PROVIDER)oom_adj:14

內容供應節點指為其他應用提供數據內容的進程,聯系人、日歷等進程屬于內容供應節點。

◆空進程(EMPTY)oom_adj:15

空進程指在后臺處于掛起狀態的應用進程,沒有任何代碼在執行。空進程的優先級最低,在LMK工作機制中,屬于最先被回收的類別。

2)進程回收時機

除了上述進程優先級之外,Android系統還維護著另外一張閥值對應表(終端廠家根據每個型號的手機按照配置和Android版本不同,對具體的閥值做調整),如表1所示(以Google Nexus One為例):

表1 oom_adj內存閥值表

這個表定義了一個對應關系,每一個閥值對應了一個進程優先級(oom_adj),當系統的可用內存低于某個閥值時,就回收大于該閥值對應的進程優先級(oom_ adj)的進程。比如,當可用內存小于6 144*4k=24MB時,開始回收EMPTY_APP進程,直至大于24MB;同理當可用內存小于5 632*4k=22MB時,開始回收CONTENT_PROVIDER以及EMPTY_APP進程。

3)操作系統設置及修改

操作系統在init.rc文件中分別定義了各個進程的優先級以及內存閥值,如下方所示:

# Define the oom_adj values for the classes of processes

# that can be killed by the kernel

setprop ro.FOREGROUND_APP_ADJ 0

setprop ro.VISIBLE_APP_ADJ 1

setprop ro.SECONDARY_SERVER_ADJ 2

setprop ro.HIDDEN_APP_ADJ 7

setprop ro.CONTENT_PROVIDER_ADJ 14

setprop ro.EMPTY_APP_ADJ 15

# Define the memory thresholds at which the above process

# classes will be killed. In pages (4k)

setprop ro.FOREGROUND_APP_MEM 1536

setprop ro.VISIBLE_APP_MEM 2048

setprop ro.SECONDARY_SERVER_MEM 4096

setprop ro.HIDDEN_APP_MEM 5120

setprop ro.CONTENT_PROVIDER_MEM 5632

setprop ro.EMPTY_APP_MEM 6144

同時,也可以通過修改/sys/module/lowmemory killer/parameters/minfree配置文件來修改各級進程回收的內存閥值,比如通過執行“echo “1836,2048,40 96,5120,5360,8192”>/sys/module/lowmemorykiller/ parameters/minfree”,可以將操作系統回收EMPTY_ APP進程的內存閥值修改為32M。

(2)進程回收(Low Memory Killer,LMK)

在(1)小節中了解到,即使當用戶退出應用程序之后,應用程序的進程也還是存在于系統中,這樣是為了方便程序的再次啟動,但若此,隨著打開的程序數量的增加,系統的內存會變得不足,就需要殺掉一部分進程以釋放內存空間,至于是否需要殺死一些進程和哪些進程需要被殺死,是通過Low Memory Killer(LMK)機制來進行判定的。

Android的Low Memory Killer(LMK)基于Linux的OOM機制,在Linux中,內存是以頁面為單位進行分配的,當申請頁面分配時如果內存不足會通過以下流程選擇bad進程來殺掉從而釋放內存。

在Low Memory Killer中通過進程的oom_adj與占用內存的大小決定要殺死的進程,oom_adj越小越不容易被殺死。參考Andoird源碼中lowmemorykiller.c的lowmem_shrink函數,計算哪些進程該回收,并發送SIGKILL信號將該進程殺死。

3 Android應用內存管理

3.1 操作系統限制

絕大多數Android應用程序本質上是一個java進程,運行在Linux內核之上的dalvik(可以理解為Android的JVM)虛擬機中,每個Android應用的虛擬機均為各自獨立的,因此Android又類似于Java的內存管理。

每個虛擬機所能使用的內存按照Android版本以及手機配置各有不同,可以通過下面的系統命令查看每臺手機上每個應用能使用內存數量的限制:

getprop | grep dalvik

[dalvik.vm.heapgrowthlimit]: [64m]

[dalvik.vm.heapsize]: [128m]

3.2 垃圾收集GC(Garbage Collector)

Java語言引入了垃圾收集機制,程序員不需要像在C/C++中一樣,手工釋放不需要的對象或內存區域,Java虛擬機可以跟蹤內存中的所有對象并可以發現和回收不再使用的對象。從而極大地減少了內存泄漏發生的可能性。

垃圾收集算法的核心思想是:虛擬機對內存中的對象進行監控,當對象不再被使用(引用數降為0)時,將對象標為垃圾對象,并在合適的時候將對象釋放并回收其占用的內存空間。垃圾回收對于系統性能有著較高的影響,因此開發人員需要對垃圾回收的算法、回收時機以及相關系統參數做深入的了解

3.3 位圖(Bitmap)資源

客戶端應用為了良好的視覺體驗,經常使用大量的圖片進行美化,圖片在內存中以位圖(Bitmap)對象來存放。使用Bitmap對象,需要緊記以下2點:

(1)Bitmap對象占內存量僅與圖片的長寬像素數有關,與原圖的圖片格式或壓縮比例無關。因此,壓縮JPG圖片的質量,而不減少圖片尺寸,是無法降低該圖片占用的內存量的。

(2)根據Android SDK文檔:“Bitmap data is not allocated in the VM heap. There is a reference to it in the VM heap (which is small), but the actual data is allocated in the Native heap by the underlying Skia graphics library … The Nat?ve heap is shared between running applications, so the amount of free space depends on what other applications are running and their bitmap usage …”,可知Bitmap對象的數據并非存放在VM Heap中,而是存放在Native Heap中,而Native Heap的空間是與其他應用程序共享的,因此即使應用程序申請的內存在3.1小節所述限額之內,也有可能申請不到內存并產生OutOfMemoryError錯誤。

4 Android應用開發建議

在第2和第3部分中,描述了Android操作系統的內存管理機制以及Android操作系統對于Android應用的各種限制,為了讓應用能夠更加穩定地運行在Android操作系統之上,應用開發者需要根據Android操作系統的特性,有針對性地優化自己的應用。

4.1 針對LMK機制

首先需要明確一點,沒有任何辦法能夠保證第三方應用不被LMK機制回收。但當應用不希望被操作系統LMK機制主動回收時,建議采用一些優化機制:

(1)盡量提高進程的優先級。在應用中實現一個Service,可以將進程變為次要服務(SECONDARY SERVER),在LMK機制中擁有較高的優先級,可以降低LMK命中的幾率。

(2)應用進入后臺運行時,盡量在應用中保留一個Activity(界面),因為在相同優先級的情況下,所有Activity均已關閉的進程會優先被回收。

(3)依賴于其他優先級高的進程。當一個進程被其他更高優先級的進程所依賴或者為其他更高優先級進程提供服務時,系統會讓此進程享有與高優先級進程同樣的優先級。例如:當某個通信錄應用正在向另外一個前臺進程(通過CONTENT PROVIDER提供)提供通信錄內容時,即使這個通信錄應用沒有任何UI在屏幕上顯示、所有Activity也已經關閉、且CONTENT PROVIDER進程的優先級不高,操作系統仍然不會回收這個通信錄應用,因為此時通信錄應用享有與前臺進程相同的優先級。

4.2 針對GC機制

根據3.2小節中對GC機制的描述,不良的代碼會導致GC機制對程序性能產生影響,并有可能導致內存不足等。因此程序員有必要在了解GC機制的基礎上,針對GC特點進行編碼,具體包括:

(1)盡量不使用靜態變量

作為全局變量,靜態變量會一直占用內存,不會被GC回收,有可能導致應用內存不足。

(2)盡快釋放不使用的對象

盡快將不使用的對象設為null,可以使得該對象盡快被GC回收,提高了GC的效率。

(3)避免集中創建或者釋放大量的對象

在短時間內大量創建對象,或者大量申請內存空間,會導致JVM進行GC以回收內存來應對應用的需求。而大量的GC請求會使得應用運行遲緩,導致應用用戶體驗下降。

(4)采用StringBuilder處理字符串累加

String是固定長的字符串對象,因此累加String對象會導致String對象的頻繁創建,盡量采用StringBuilder來處理字符串累加。

(5)盡量使用基本類型變量

基本類型變量比對象變量占用內存更小,因此應該盡量使用基本類型變量。

4.3 針對位圖(Bitmap)資源

由3.3小節可知,Android中存儲Bitmap數據的內存區域是有限的,而且需要與其他應用程序共享,即使申請的內存總量仍在虛擬機的限額之內,也可能因為其他應用產生了過多Bitmap數據而導致內存不足,因此小心地使用Bitmap對象,不僅可以使自己的應用程序更加穩定,也會使得在Android運行環境上執行的其他應用程序更加穩定。

(1)及時回收

當應用不再使用某個Bitmap對象時,盡量不要等待系統自動釋放,應該盡快調用“recycle()”釋放Bitmap占用的內存空間。

(2)捕獲異常

在產生Bitmap對象的地方捕捉OutOfMemoryError錯誤,能夠有效地減少因為內存不足而造成的應用程序崩潰。

(3)同樣的圖片避免生成多個Bitmap對象

很多情況下,可能需要在一個Activity里多次用到同一張圖片(如好友列表中的默認頭像等)。此時應該盡量使用同一個Bitmap對象,不應新建多個Bitmap對象,避免內存的浪費。

(4)盡量避免使用大圖片

Bitmap對象占用內存的空間=圖片長邊像素數*圖片寬邊像素數*顏色深度(也就是每位像素占用的內存數)。可見Bitmap對象占用的內存空間與圖片的像素成正比,當圖片太大時,很容易引發內存不足。根據圖片顯示區域的大小,使用BitmapFactory.Options設置inSampleSize縮小圖片,可以有效地減少大圖片對內存的影響。

5 結束語

移動互聯網正在飛速發展,Android設備正在飛速普及,本文有針對性地介紹了Android操作系統內存管理方面的機制,并針對Android應用開發者提出了有效可實施的建議。

[1] Google Inc. Android源代碼[EB/OL]. [2014-08-27]. http://code.google.com/p/android/.

[2] Google Inc. Android SDK文檔[EB/OL]. [2014-08-27]. http://developer.android.com.

[3] 池煒成. Java垃圾收集的機制及調優[J]. 計算機應用研究, 2004(3): 144-148.

[4] 柯元旦. Android內核剖析[M]. 北京: 電子工業出版社, 2011.

[5] Cay S Horstmann, Gray Cornell. Java核心技術[M]. 周立新,陳波,葉乃文,等,譯. 北京: 機械工業出版社, 2014. ★

宋平波:碩士畢業于英國紐卡斯爾大學通信及信號處理專業,現任職于中國電信股份有限公司廣東研究院,主要研究方向為移動互聯網應用、電子商務等電信級平臺開發。

李云:學士畢業于哈爾濱工業大學電子與通信工程系,現任職于中國電信股份有限公司廣東研究院,主要研究方向為移動互聯網應用、搜索引擎、電子商務等電信級平臺開發。

楊豪杰:碩士畢業于中山大學軟件學院,現任職于中國電信股份有限公司廣東研究院,主要研究方向為移動互聯網應用平臺開發。

Research on Android Memory Management

SONG Ping-bo, LI Yun, YANG Hao-jie
(Guangdong Research Institute of China Telecom Co., Ltd., Guangzhou 510630, China)

In this paper, the memory management and memory deallocation schemes of Android operating system were analyzed in depth. Then, effective suggestions targeted at Android application developers were put forward.

Android memory management memory deallocation

10.3969/j.issn.1006-1010.2015.07.020

TP311.1

A

1006-1010(2015)07-0092-05

宋平波,李云,楊豪杰. Android內存管理機制研究[J]. 移動通信, 2015,39(7): 92-96.

2014-08-29

責任編輯:劉文竹 liuwenzhu@mbcom.cn

猜你喜歡
進程機制系統
Smartflower POP 一體式光伏系統
工業設計(2022年8期)2022-09-09 07:43:20
WJ-700無人機系統
ZC系列無人機遙感系統
北京測繪(2020年12期)2020-12-29 01:33:58
債券市場對外開放的進程與展望
中國外匯(2019年20期)2019-11-25 09:54:58
自制力是一種很好的篩選機制
文苑(2018年21期)2018-11-09 01:23:06
連通與提升系統的最后一塊拼圖 Audiolab 傲立 M-DAC mini
破除舊機制要分步推進
中國衛生(2015年9期)2015-11-10 03:11:12
注重機制的相互配合
中國衛生(2014年3期)2014-11-12 13:18:12
打基礎 抓機制 顯成效
中國火炬(2014年4期)2014-07-24 14:22:19
社會進程中的新聞學探尋
民主與科學(2014年3期)2014-02-28 11:23:03
主站蜘蛛池模板: 国产不卡一级毛片视频| 亚洲精品无码不卡在线播放| 中文字幕在线观看日本| 日韩欧美91| 中文字幕无码电影| 五月婷婷精品| 熟妇丰满人妻| 无码人妻免费| 国产美女久久久久不卡| 亚洲综合精品香蕉久久网| 久久久久久尹人网香蕉 | 色香蕉网站| 香蕉视频在线精品| 国产精品永久不卡免费视频| 制服丝袜亚洲| 久草视频精品| 中文字幕首页系列人妻| 国产精品大白天新婚身材| 日本精品中文字幕在线不卡 | 91久久国产综合精品女同我| 亚洲一级毛片免费观看| 无码啪啪精品天堂浪潮av| 凹凸国产熟女精品视频| 日韩高清成人| 国产精品女主播| 国产精品吹潮在线观看中文| 国产屁屁影院| 亚洲成人高清在线观看| 国产欧美日韩18| 午夜福利网址| 在线免费观看AV| 老色鬼欧美精品| 一级在线毛片| 国产女人在线视频| 亚洲欧美日本国产专区一区| 欧美色综合网站| 亚洲国产精品一区二区第一页免| 毛片免费试看| 国产成人精品一区二区免费看京| 亚洲无码高清一区二区| 尤物精品国产福利网站| 亚洲毛片在线看| 欧美一区福利| 国产视频自拍一区| 国产精品yjizz视频网一二区| 免费一级毛片在线播放傲雪网| 国产成人亚洲精品色欲AV| 亚洲天堂区| 国产拍在线| 91精品国产一区自在线拍| 狠狠操夜夜爽| 国产精品专区第1页| 午夜日b视频| 国产永久在线视频| 全色黄大色大片免费久久老太| 91视频国产高清| 成人免费视频一区二区三区| 蜜桃视频一区二区三区| 色婷婷狠狠干| 日韩一区精品视频一区二区| 激情六月丁香婷婷四房播| 久久黄色免费电影| аⅴ资源中文在线天堂| 成人欧美在线观看| 国产95在线 | 乱人伦视频中文字幕在线| 国产主播一区二区三区| 日韩人妻少妇一区二区| 伊人狠狠丁香婷婷综合色| 蜜桃视频一区二区| 国产高清精品在线91| 欧美97色| 久久精品无码专区免费| 国产精品欧美在线观看| 日韩欧美网址| 极品国产一区二区三区| 中国国产高清免费AV片| 无码精品国产dvd在线观看9久| 小蝌蚪亚洲精品国产| 亚洲国产欧美自拍| 久一在线视频| 精品无码人妻一区二区|