1、關(guān)閉沒必要的常駐內(nèi)存軟件——大多數(shù)人習(xí)慣開啟一些安全管理軟件,諸如360、LBE、金山,并且把他們的來電攔截、短信攔截、黑名單攔截功能全部開啟,這樣的確能起到一定安全性,但是對于手機配置不高的朋友來說,這個功能只會使得RAM內(nèi)存被長時間占用,同時又耗電量。
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比宣城網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式宣城網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋宣城地區(qū)。費用合理售后完善,10年實體公司更值得信賴。
2、關(guān)閉手機省電管理軟件——絕大多數(shù)字習(xí)慣在手機軟件上安裝省電管家之類的軟件,其實,和上面提到的攔截軟件相比較,這個軟件可以說完全是多余的。首先,一般的手機系統(tǒng)設(shè)置里面完全有基本的電量顯示、省電管理的功能可以取代這個。其次這個軟件本身而言就在吃著你手機的電量、內(nèi)存。真正的手機發(fā)燒友不是安裝一大堆軟件,而是懂得發(fā)覺系統(tǒng)、軟件的最大性能。
3、用手機系統(tǒng)流量監(jiān)控代替第三方軟件的監(jiān)控——這里和上面同理,第三方軟件的使用的確揉合各種功能,但你做出的犧牲時你的RAM內(nèi)存。繞這么多,其實就是要告訴你,手機系統(tǒng)的原生功能遠(yuǎn)可以代替占用資源的第三方軟件幫你實現(xiàn)系統(tǒng)管理。當(dāng)然,自動的系統(tǒng)管理在美化上面是遜了點。
4、精簡、卸載手機系統(tǒng)自動軟件——前提是你必須獲得手機ROOT,一般玩機的朋友可以在獲得后對系統(tǒng)做出更近一步的優(yōu)化。
安卓手機內(nèi)存經(jīng)常不夠用的解決方法一:
1、存儲內(nèi)存的清理:
由于軟件會緩存很多文件占用內(nèi)存,卸載后的殘留文件我們可以用一款叫做“獵豹清理大師”(原金山清理大師)的軟件對垃圾文件進行清理。
2、運行內(nèi)存的清理:
可以長按Home鍵,調(diào)出近期任務(wù)列表,關(guān)閉不需要的程序,釋放一定的`內(nèi)存空間。
在內(nèi)存嚴(yán)重不足的情況下,可以嘗試破解系統(tǒng)最高權(quán)限,卸載不需要的內(nèi)置軟件。
3、一般內(nèi)存手機運行內(nèi)存低于1G就會出現(xiàn)明顯的卡頓,所以選購手機最好挑選2G以上的手機。
其次:
手機內(nèi)存空間所剩不多,需要做以下操作:
1、清理垃圾。用垃圾清理軟件,清理一下手機的垃圾。推薦獵豹清理大師、LBE安全大師、SD女傭等。
2、移走相冊。一般,手機中最大的空間占用處是相冊,長時間拍照和拍攝視頻,會占用大量的空間。需要把這些照片和視頻移到電腦里或移到云盤里,以節(jié)省空間。
3、壓縮相片。很多軟件都有壓縮相片的功能。比如獵豹清理大師、360等??梢栽诋嬞|(zhì)沒有明顯變化的前提下,把照片進行再一次壓縮,占用空間至少節(jié)省一半。
4、刪除系統(tǒng)內(nèi)無用的軟件。這個需要root后,然后刪除。最好刪除游戲和運營商增值應(yīng)用,不要刪不了解的系統(tǒng)程序。
5、把應(yīng)用移動到SD卡上。在應(yīng)用管理器里,找到應(yīng)用,移到SD卡上。
安卓手機內(nèi)存經(jīng)常不夠用的解決方法二:
1、終止后臺不常用軟件運行程序
很多人,通常只是在界面關(guān)閉軟件。對于安卓機來說,這些程序可能還在后臺運行,比如優(yōu)酷等視頻網(wǎng)站,如果后臺同時開好幾個,所占的運行內(nèi)存RAM可想而知有多少,這時候需要關(guān)閉后臺運行這些軟件,釋放RAM內(nèi)存空間。可以下載應(yīng)用管家,一鍵隔離應(yīng)用,關(guān)閉后臺程序,徹底釋放內(nèi)存(前提是要root權(quán)限)。
2、限制后臺一些軟件自動啟動
有些軟件我們安裝時,被默認(rèn)為開機“自動啟動”了。“房間”有限,很多軟件同時運行,就會出現(xiàn)擁擠,不僅影響手機速度,浪費流量,還會阻止手機軟件安裝。這樣就需要禁止某些不常用軟件的自動啟動。可以用“應(yīng)用管家”,隔離功能,隔離凍結(jié)應(yīng)用,應(yīng)用在不用的情況下,防止其自啟,釋放內(nèi)存。
3、默認(rèn)安裝到SD內(nèi)存擴展卡
這種情況,是針對裝有SD內(nèi)存擴展卡的手機。內(nèi)存卡雖然可以擴展手機存儲內(nèi)存,但是如果不設(shè)置默認(rèn)存儲位置,下載的軟件還是會自動安裝到手機空間。所以,優(yōu)先選擇存儲位置為SD卡,這樣軟件就會自動安裝在擴展卡里運行。
操作:【設(shè)置】-【儲存】-【手機存儲】-【存儲位置】-【默認(rèn)存儲位置】-【SD卡】
內(nèi)容整理自網(wǎng)絡(luò)。
在做內(nèi)存優(yōu)化的時候,我們發(fā)現(xiàn)除了解決內(nèi)存泄露問題,剩下的就只有想辦法減少真實的內(nèi)存占用。而在App中,大部分內(nèi)存可能被我們圖片占用了,所以減少圖片的內(nèi)存占用可以帶來直接的效果。本文就簡單介紹一張圖片到底占用多少內(nèi)存,我們先假設(shè)我們有一張圖片時** 600 * 800** 的,圖片占用空間大小假設(shè)是** 100KB**。
圖片內(nèi)存大小跟占用空間大小有什么關(guān)系?
占用空間的大小不是圖片占用內(nèi)存的大小,一些初學(xué)者可能會誤解一下。占用空間是在磁盤上占用的空間,內(nèi)存大小是加載到內(nèi)存中占用的內(nèi)存大小。兩個只是單位是一樣的,本質(zhì)不是一個概念。
一張圖片到底占用多少內(nèi)存呢?(ARGB_8888編碼)
1. 圖片占用內(nèi)存的計算公式: 圖片高度 * 圖片寬度 * 一個像素占用的內(nèi)存大小
2. 所以上面的圖片占用內(nèi)存是:**800 * 600 * 4 byte = 1875KB = 1.83M **
上面的計算公式中,為什么是4byte呢?文章后面有總結(jié)哦
圖片所在目錄對內(nèi)存的影響?
在Android中,圖片的存放目錄和手機的屏幕密度影響圖片最終的大小,舉個例子:
假設(shè)我們的圖片放到 xhdpi 目錄下,那么我們本文中的圖片占用的內(nèi)存大小如下:
屏幕密度為2的設(shè)備:800 * 600 * 4byte = 1.83M
屏幕密度為3的設(shè)備:800 * 1.5 * 600 * 1.5 * 4byte = 1.83 * 2.25M =** 4.12M**
所以,計算圖片占用內(nèi)存大小的時候,要考慮圖片所在的目錄跟設(shè)備密度,這兩個因素其實影響的是圖片的高寬,android會對圖片進行拉升跟壓縮。
總結(jié)
1. 圖片確實很占用內(nèi)存,內(nèi)存優(yōu)化先考慮圖片內(nèi)存占用;
2. 一定要避免使用大圖片,這就是.9圖很有用的原因之一;
3. 圖片的大小對內(nèi)存的影響是正比關(guān)系;
4. 本文只是簡單的告知讀者怎么計算圖片的內(nèi)存大小。
大圖: 440 * 336 ?? 小圖: 220 * 168 資源目錄: xhdpi
小圖的高寬都是大圖的1/2--小圖是原圖的1/4
界面效果:
測試設(shè)備: Coolpad ? 8676-M01 ? 5.1 ? density=2.0
測試前準(zhǔn)備操作: 同一款設(shè)備,設(shè)置圖片前后多次調(diào)用gc直到內(nèi)存短時間內(nèi)保持穩(wěn)定不再變化
內(nèi)存使用情況: 下圖依次是 初始內(nèi)存,大圖內(nèi)存,小圖內(nèi)存
大圖占用內(nèi)存: 11.23 MB - 10.66 MB = 0.57 MB
小圖占用內(nèi)存: 10.81 MB - 10.66 MB = 0.15 MB
大圖小圖內(nèi)存關(guān)系: 0.15 MB * 4 = 0.60 MB 約等于 0.57 MB (這是統(tǒng)計工具的誤差,理論上就是相等的)
同樣的方式在另外一臺設(shè)備小米4c上得到的結(jié)果如下:
測試設(shè)備: Xiaomi ? Mi-4c ? V8.2.1.0.LXKCNDL ? 5.1.1 ? density=3.0
大圖占用內(nèi)存: 13.22 MB - 11.95 MB = 1.27 MB
小圖占用內(nèi)存: 12.27 MB - 11.95 MB = 0.32 MB
大圖小圖內(nèi)存關(guān)系: 0.32 MB * 4 = 1.28 MB 約等于 1.27 MB
結(jié)論: 由此可見大圖比小圖占用更多的內(nèi)存,圖片大小(分辨率)與占用內(nèi)存成正比關(guān)系
備注: 圖片在硬盤上占用的磁盤空間大小,與在內(nèi)存中占用的內(nèi)存大小完全不一樣,不是一個概念,不要混淆
根據(jù)上文中圖片大小與內(nèi)存的關(guān)系,可以更加深刻的理解Android中.9圖片的作用,它不但能減少apk的體積,還能減少圖片占用內(nèi)存。
有些時候我們根本不需要圖片,而是自己繪制背景,可以在自定義View的onDraw中繪制背景,當(dāng)然最方便的還是使用系統(tǒng)的Drawable,繪制部分交給系統(tǒng)去完成。
下面測試圖片與Drawable的內(nèi)存占用對比
原始圖片大?。?482 * 482
界面效果:
測試設(shè)備: Xiaomi ? Mi-4c ? V8.2.1.0.LXKCNDL ? 5.1.1
測試前準(zhǔn)備操作: 同一款設(shè)備,設(shè)置背景前后多次調(diào)用gc直到內(nèi)存短時間內(nèi)保持穩(wěn)定不再變化
內(nèi)存使用情況: 下圖依次是 初始內(nèi)存,使用圖片占用的內(nèi)存,使用Drawable占用的內(nèi)存,使用onDraw繪制占用的內(nèi)存
使用圖片占用內(nèi)存: 13.97 MB - 11.97 MB = 2.00 MB
使用Drawable占用內(nèi)存: 11.97 MB - 11.97 MB = 0.00 MB (不會是0,有誤差,只是很少)
使用onDraw繪制占用內(nèi)存: 11.98 MB - 11.97 MB = 0.01 MB
結(jié)論: 繪制背景,或者使用系統(tǒng)提供Drawable作為背景,會大大減少內(nèi)存占用
Drawable參考資料:
Drawable實戰(zhàn)解析:Android XML shape 標(biāo)簽使用詳解(apk瘦身,減少內(nèi)存好幫手)
Android GradientDrawable(shape標(biāo)簽定義)靜態(tài)使用和動態(tài)使用(圓角,漸變實現(xiàn))
“讓你的圖片最小化”一節(jié)中描述的方法:使用盡可能小的圖,使用.9,自己繪制背景或者使用Drawable來繪制背景
加載大圖片時需要對圖片進行壓縮,使用等比例壓縮方法直接在內(nèi)存中處理圖片
這樣做要注意的是,圖片質(zhì)量會變差,inSampleSize設(shè)置的值越大,圖片質(zhì)量就越差。
有時候我們?nèi)〉靡粡垐D片,也許只是為了獲得這個圖片的一些信息,比如圖片的width、height等信息,不需要顯示到界面上,這個時候我們可以不把圖片加載到內(nèi)存中。
由于Android外層是使用java,而底層使用的是C語言為圖片對象分配的內(nèi)存空間。所以我們的外部雖然看起來釋放了,但里層卻并不一定完全釋放了,我們使用完圖片后最好再釋放掉里層的內(nèi)存空間。
RGB(ARGB)
RGB色彩模式是工業(yè)界的一種顏色標(biāo)準(zhǔn),是通過對紅(R)、綠(G)、藍(lán)(B)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,RGB即是代表紅、綠、藍(lán)三個通道的顏色,這個標(biāo)準(zhǔn)幾乎包括了人類視力所能感知的所有顏色,是目前運用最廣的顏色系統(tǒng)之一。在Android中還有包含透明度Alpha的顏色模型,即ARGB。
YUV
YUV,分為三個分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用于指定像素的顏色。
YUV的原理是把亮度與色度分離,研究證明,人眼對亮度的敏感超過色度。利用這個原理,可以把色度信息減少一點,人眼也無法查覺這一點。
主要用于電視系統(tǒng)以及模擬視頻領(lǐng)域,它將亮度信息(Y)與色彩信息(UV)分離,沒有UV信息一樣可以顯示完整的圖像,只不過是黑白的,這樣的設(shè)計很好地解決了彩色電視機與黑白電視的兼容問題
YUV的存儲中與RGB格式最大不同在于,RGB格式每個點的數(shù)據(jù)是連繼保存在一起的。即R,G,B是前后不間隔的保存在2-4byte空間中。而YUV的數(shù)據(jù)中為了節(jié)約空間,U,V分量空間會減小。每一個點的Y分量獨立保存,但連續(xù)幾個點的U,V分量是保存在一起的,(反正人眼一般也看不出區(qū)別).這幾個點合起來稱為macro-pixel, 這種存儲格式稱為Packed格式。另外一種存儲格式是把一幅圖像中Y,U,V分別用三個獨立的數(shù)組表示。這種模式稱為planar模式。
CMYK
??CMYK也稱作印刷色彩模式,顧名思義就是用來印刷的。印刷四分色模式是彩色印刷時采用的一種套色模式,利用色料的三原色混色原理,加上黑色油墨,共計四種顏色混合疊加,形成所謂“全彩印刷”。四種標(biāo)準(zhǔn)顏色是:
CMYK和RGB相比有一個很大的不同:RGB模式是一種發(fā)光的色彩模式,你在一間黑暗的房間內(nèi)仍然可以看見屏幕上的內(nèi)容;CMYK是一種依靠反光的色彩模式,我們是怎樣閱讀報紙的內(nèi)容呢?是由陽光或燈光照射到報紙上,再反射到我們的眼中,才看到內(nèi)容。它需要有外界光源,如果你在黑暗房間內(nèi)是無法閱讀報紙的。只要是在印刷品上看到的圖像,就是CMYK模式表現(xiàn)的。比如期刊、雜志、報紙、宣傳畫等,都是印刷出來的,那么就是CMYK模式的了。
CMYK原色與疊加之后的顏色對比
在不考慮透明度的情況下,一個像素點的顏色值在計算機中的表示方法有以下3種:
在Java中,float類型的變量占32位,int類型的變量占32位,short和char類型的變量都在16位,因此可以看出,用浮點數(shù)表示法編碼一個像素的顏色,內(nèi)存占用量是96位即12字節(jié);而用24位整數(shù)表示法編碼,只要一個int類型變量,占用4個字節(jié)(高8位空著,低24位用于表示顏色);用16位整數(shù)表示法編碼,只要一個short類型變量,占2個字節(jié);因此可以看出采用整數(shù)表示法編碼顏色值,可以大大節(jié)省內(nèi)存,當(dāng)然,顏色質(zhì)量也會相對低一些。在Android中獲取Bitmap的時候一般也采用整型編碼。
回想一下Android的BitmapConfig類中,有ARGB_8888、ARGB_4444、RGB565等常量,現(xiàn)在可以知道它們分別代表了什么含義。同時也可以計算一張圖片在內(nèi)存中可能占用的大小,比如采用ARGB_8888編碼載入一張1920 1200的圖片,大概就會占用1920 1200*4/1024/1024=8.79MB的內(nèi)存。
采用低內(nèi)存占用量的編碼方式,比如Bitmap.Config.ARGB_4444比Bitmap.Config.ARGB_8888更省內(nèi)存;
1920 1200的圖片:*
ARGB_8888:1920 1200 4/1024/1024=8.79MB
ARGB_4444,RGB565:1920 1200 2/1024/1024=4.39MB
在Android中,對圖片的使用一定要關(guān)注,大多數(shù)情況下,占用內(nèi)存多,OOM發(fā)生都是因為圖片資源使用不當(dāng)。不要盲目加一個大圖到Android項目中,能使用.9進來使用,而且.9圖本身盡可能小,另外能使用繪制實現(xiàn)就不要加一個圖片資源。有些時候,在不影響用戶體驗的情況下,可以降低圖片素材質(zhì)量,比如不需要透明度的就不要了,有些透明度用肉眼看不出來。
部分內(nèi)容出至林學(xué)森的Android內(nèi)核設(shè)計思想。
Android官網(wǎng)內(nèi)存管理
部分出至
Android本質(zhì)是Linux所以先從Linux說起。
Linux的內(nèi)存管理為系統(tǒng)中所有的task提供可靠的內(nèi)存分配、釋放和保護機制。
核心:
虛擬內(nèi)存
內(nèi)存分配與釋放
內(nèi)存保護
將外存儲器的部分空間作為內(nèi)存的擴展,如從硬盤劃出4GB大小。
當(dāng)內(nèi)存資源不足時,系統(tǒng)按照一定算法自動條形優(yōu)先級低的數(shù)據(jù)塊,并把他們存儲到硬盤中。
后續(xù)如果需要用到硬盤中的這些數(shù)據(jù)塊,系統(tǒng)將產(chǎn)生“缺頁”指令,然后把他們交換回內(nèi)存中。
這些都是由操作系統(tǒng)內(nèi)核自動完成的,對上層應(yīng)用”完全透明“。
每個進程的邏輯地址和物理地址都不是直接對應(yīng)的,任何進程都沒辦法訪問到它管轄范圍外的內(nèi)存空間——即刻意產(chǎn)生的內(nèi)存越界與非法訪問,操作系統(tǒng)也會馬上阻止并強行關(guān)閉程序,從而有力的保障應(yīng)用程序和操作系統(tǒng)的安全和穩(wěn)定。
一旦發(fā)現(xiàn)系統(tǒng)的可用內(nèi)存達(dá)到臨界值,機會按照優(yōu)先級順序,匆匆低到高逐步殺掉進程,回收內(nèi)存。
存儲位置:/proc/PID/oom_score
優(yōu)先級策略:
進程消耗的內(nèi)存
進程占用的CPU時間
oom_adj(OOM權(quán)重)
Android平臺運行的前提是可用內(nèi)存是浪費的內(nèi)存。它試圖在任何時候使用所有可用的內(nèi)存。例如,系統(tǒng)會在APP關(guān)閉后將其保存在內(nèi)存中,以便用戶可以快速切換回它們。出于這個原因,Android設(shè)備通常運行時只有很少的空閑內(nèi)存。在重要系統(tǒng)進程和許多用戶應(yīng)用程序之間正確分配內(nèi)存內(nèi)對存管理是至關(guān)重要。
Android有兩種主要的機制來處理低內(nèi)存的情況:內(nèi)核交換守護進程(kernel swap daemon)和低內(nèi)存殺手(low-memory killer)。
當(dāng)用戶在APP之間切換時,Android會在最近使用的(LRU)緩存中保留不在前臺的APP,即用戶看不到的APP,或運行類似音樂播放的前臺服務(wù)。如果用戶稍后返回APP,系統(tǒng)將重用該進程,從而使APP切換更快。
如果你的APP有一個緩存進程,并且它保留了當(dāng)前不需要的內(nèi)存,那么即使用戶不使用它,你的APP也會影響系統(tǒng)的整體性能。由于系統(tǒng)內(nèi)存不足,它會從最近使用最少的進程開始?xì)⑺繪RU緩存中的進程。該系統(tǒng)還負(fù)責(zé)處理占用最多內(nèi)存的進程,并可以終止這些進程以釋放RAM。
當(dāng)系統(tǒng)開始終止LRU緩存中的進程時,它主要是自底向上工作的。系統(tǒng)還考慮哪些進程消耗更多的內(nèi)存,從而在終止時為系統(tǒng)提供更多的內(nèi)存增益。你在LRU列表中消耗的內(nèi)存越少,你就越有可能留在列表中并能夠快速恢復(fù)。
為了滿足RAM的所有需求,Android嘗試共享RAM來跨進程通信。它可以做到以下方式:
Android設(shè)備包含三種不同類型的內(nèi)存:RAM、zRAM和storage。
注意:CPU和GPU都訪問同一個RAM。
內(nèi)存被拆分成頁。通常每頁有4KB的內(nèi)存。
頁面被認(rèn)為是空閑的或已使用的。
空閑頁是未使用的RAM。
已使用頁是系統(tǒng)正在積極使用的RAM,分為以下類別:
干凈的頁面(Clean pages)包含一個文件(或文件的一部分)的一份精確副本存在存儲器上。當(dāng)一個干凈的頁面不再包含一個精確的文件副本(例如,來自應(yīng)用程序操作的結(jié)果)時,它就變成了臟頁??梢詣h除干凈的頁,因為它們始終可以使用存儲中的數(shù)據(jù)重新生成;不能刪除臟頁(Dirty pages),否則數(shù)據(jù)將丟失。
內(nèi)核跟蹤系統(tǒng)中的所有內(nèi)存頁。
當(dāng)確定一個應(yīng)用程序正在使用多少內(nèi)存時,系統(tǒng)必須考慮shared pages。APP訪問相同的服務(wù)或庫將可能共享內(nèi)存頁。例如,Google Play Services 和一個游戲APP可能共享一個位置服務(wù)。這使得很難確定有多少內(nèi)存屬于這個服務(wù)相對于每個APP。
當(dāng)操作系統(tǒng)想要知道所有進程使用了多少內(nèi)存時,PSS非常有用,因為頁面不會被多次計數(shù)。PSS需要很長時間來計算,因為系統(tǒng)需要確定哪些頁面是共享的,以及被有多少進程。RSS不區(qū)分共享頁面和非共享頁面(使計算速度更快),更適合于跟蹤內(nèi)存分配的更改。
內(nèi)核交換守護進程(kswapd)是Linux內(nèi)核的一部分,它將使用過的內(nèi)存轉(zhuǎn)換為空閑內(nèi)存。當(dāng)設(shè)備上的空閑內(nèi)存不足時,守護進程將變?yōu)榛顒訝顟B(tài)。Linux內(nèi)核保持低和高的可用內(nèi)存閾值。當(dāng)空閑內(nèi)存低于低閾值時,kswapd開始回收內(nèi)存。當(dāng)空閑內(nèi)存達(dá)到高閾值,kswapd將停止回收內(nèi)存。
kswapd可以通過刪除干凈的頁面來回收干凈的頁面,因為它們有存儲器支持并且沒有被修改。如果進程試圖尋址已刪除的干凈頁,則系統(tǒng)會將該頁從存儲器復(fù)制到RAM。此操作稱為請求分頁。
kswapd將緩存的私有臟頁(private dirty pages)和匿名臟頁(anonymous dirty pages)移動到zRAM進行壓縮。這樣做可以釋放RAM中的可用內(nèi)存(空閑頁)。如果進程試圖觸摸zRAM中臟頁,則該頁將被解壓縮并移回RAM。如果與壓縮頁關(guān)聯(lián)的進程被終止,則該頁將從zRAM中刪除。
如果可用內(nèi)存量低于某個閾值,系統(tǒng)將開始終止進程。
lmkd實現(xiàn)源碼要在system/core/lmkd/lmkd.c。
lmkd會創(chuàng)建名為lmkd的socket,節(jié)點位于/dev/socket/lmkd,該socket用于跟上層framework交互。
小結(jié):
LMK_TARGET: AMS.updateConfiguration() 的過程中調(diào)用 updateOomLevels() 方法, 分別向/sys/module/lowmemorykiller/parameters目錄下的minfree和adj節(jié)點寫入相應(yīng)信息;
LMK_PROCPRIO: AMS.applyOomAdjLocked() 的過程中調(diào)用 setOomAdj() 向/proc/pid/oom_score_adj寫入oom_score_adj后直接返回;
LMK_PROCREMOVE: AMS.handleAppDiedLocked 或者 AMS.cleanUpApplicationRecordLocked() 的過程,調(diào)用remove(),目前不做任何事,直接返回;
為了進一步幫助平衡系統(tǒng)內(nèi)存并避免終止APP進程,可以Activity類中實現(xiàn)ComponentCallbacks2接口。提供的onTrimMemory()回調(diào)方法允許APP在前臺或后臺偵聽與內(nèi)存相關(guān)的事件,然后釋放對象以響應(yīng)應(yīng)用程序生命周期或表明系統(tǒng)需要回收內(nèi)存的系統(tǒng)事件。
onTrimMemory()回調(diào)是在Android 4.0(API級別14)中添加的。
對于早期版本,可以使用onLowMemory(),它大致相當(dāng)于TRIM_MEMORY_COMPLETE事件。
一個專門的驅(qū)動。(Linux Kernel 4.12 已移除交給kswapd處理)。
很多時候,kswapd無法為系統(tǒng)釋放足夠的內(nèi)存。在這種情況下,系統(tǒng)使用onTrimMemory()通知APP內(nèi)存不足,應(yīng)該減少其分配。如果這還不夠,內(nèi)核將開始終止進程以釋放內(nèi)存,它使用低內(nèi)存殺手(LMK)來完成這個任務(wù)。
為了決定要終止哪個進程,LMK使用一個名為oom_adj_score的“out of memory”分?jǐn)?shù)來確定運行進程的優(yōu)先級,高分的進程首先被終止。
后臺應(yīng)用程序首先被終止,系統(tǒng)進程最后被終止。
下表列出了從高到低的LMK評分類別。第一排得分最高的項目將首先被殺死:
Android Runtime(ART)和Dalvik虛擬機使用分頁(Paging)和內(nèi)存映射(mmapping)來管理內(nèi)存。應(yīng)用程序通過分配新對象或觸摸已映射頁面來修改內(nèi)存都將保留在RAM中,并且不能被調(diào)出。應(yīng)用程序釋放內(nèi)存的唯一方式是垃圾收集器。
文章名稱:android內(nèi)存使用,安卓內(nèi)存占用
當(dāng)前URL:http://jinyejixie.com/article38/dsdjgpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、品牌網(wǎng)站制作、網(wǎng)站設(shè)計公司、標(biāo)簽優(yōu)化、網(wǎng)站設(shè)計、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)