A. 瀹夊崜8.0闇瑕佸氬ぇ鐨勮繍琛屽唴瀛樺拰瀛樺偍絀洪棿錛
瀹夊崜8錛0涓嶅瓨鍦ㄩ渶瑕佺壒瀹氱殑榪愯屽唴瀛鍜屽瓨鍌ㄧ┖闂淬傚彧瑕佹槸瀹夊崜緋葷粺鐨勬櫤鑳芥墜鏈洪兘鍙浠ュ畨瑁呫
android8錛0鏄璋鋒瓕錛圙oogle錛夋帹鍑虹殑鏅鴻兘鎵嬫満鎿嶄綔緋葷粺錛2017騫3鏈21鏃Google涓哄紑鍙戣呮帹鍑轟簡鏂扮殑AndroidO棣栦釜寮鍙戣呴勮堢増錛2017GoogleI錛廜寮鍙戣呭ぇ浼氫笂鍙戝竷浜嗙浜屼釜AndroidO寮鍙戣呴勮堛
2017騫8鏈22鏃ワ紝璋鋒瓕姝e紡鍙戝竷浜咥ndroid8錛0鐨勬e紡鐗堬紝鍏舵e紡鍚嶇О涓猴細AndroidOreo錛堝ゥ鍒╁ゥ錛夈2017騫12鏈5鏃ヨ胺姝屾e紡鍙戝竷浜咥ndroid8錛1鐨勬e紡鐗堛
鎵╁睍璧勬枡錛
Android8錛0鐨勯厤閫傛満鍨嬶細
璋鋒瓕瀹e竷錛屽畨鍗8鍒濇湡浠呭悜鈥滃畨鍗撳紑婧愯″垝鈥濓紙Android Open Source Project錛夌殑鐢ㄦ埛寮鏀撅紝瀵硅胺姝岀殑Pixel鍜孨exus鎵嬫満鐢ㄦ埛鍦ㄤ笉涔呯殑灝嗘潵涔熷皢寮鏀炬洿鏂般傚叾浠栧搧鐗岀殑鏅鴻兘鎵嬫満鍜騫蟲澘鐢佃剳鍒欒佸彇鍐充簬灝忕背銆佷笁鏄熴佸崕涓哄拰OnePlus絳夌‖浠跺埗閫犲晢銆
姝e紡鐗圓ndroid8錛0灝嗗緢蹇鎺ㄩ佺粰Pixel鍜孨exus璁懼囷紝絎涓鎵規敮鎸丄ndroid8錛0鐨勪駭鍝佸垎鍒涓篜ixel銆丳ixelXL銆丳ixelC銆丯exus6P銆丯exus5X浠ュ強NexusPlayer銆
鍙傝冭祫鏂欙細鐧懼害鐧劇-瀹夊崜8.0
B. android 鍐呭瓨鏁版嵁瀛樺偍鏂瑰紡鍜寃indows鐨勫尯鍒
瀛樺偍絀洪棿涓鏈変袱涓鍐呭瓨鈥濓細RAM鍜孯OM銆傚叾涓錛孯AM灝辨槸榪愯屽唴瀛橈紝灝卞ソ浼糚C涓鐨勫唴瀛樻潯錛涜孯OM灝辨槸澶瑙嗙偖杞扮殑瀛樺偍絀 闂達紝鐩稿綋浜嶱C涓鐨勭‖鐩樸 鑰孯OM鍒嗕負涓変釜鍒嗗尯錛 緋葷粺鍒嗗尯----鐢ㄤ簬瀛樻斁Android緋葷粺 (Android4.x鐗堢郴緇熻嚦灝500MB浠ヤ笂)銆佽繕鍘熷囦喚(300MB宸﹀彸)銆佸埛鏈篟ecovery璧勬簮(綰20MB鍀50MB)銆佺郴緇熺駭APP(瀹 瑁呭湪姝ょ┖闂寸殑APP闇瑕丷oot鏉冮檺鎵嶅彲鍗歌澆)浠ュ強浜ゆ崲絀洪棿銆佺‖浠跺簳灞傜┖闂寸瓑絳夛紝鍔犲湪涓璧風害1.5GB鍀2GB銆傝繖閮ㄥ垎絀洪棿灝卞ソ浼糚C涓婂畨瑁呭湪C鐩樹腑鐨 Windows緋葷粺鍜岀‖浠墮┍鍔ㄧ▼搴忥紝浠ュ強鐢ㄤ簬瀛樻斁涓閿鎮㈠嶉暅鍍忕殑闅愯棌鍒嗗尯銆 銆銆紼嬪簭鍒嗗尯----鐢ㄤ簬瀛樻斁闅忔満棰勮呯殑絎涓夋柟 APP(鐢ㄦ埛鍙鍗歌澆)錛屼綘鑷宸變笅杞界殑鎵鏈堿PP涓葷▼搴忛兘浼氬畨瑁呭埌榪欎釜絀洪棿鍐咃紝鎵嬫満鍘傚晢閫氬父浼氫負姝ゅ垎鍖洪勭暀1GB鍀3GB鐨勫瓨鍌ㄧ┖闂淬傚綋璇ョ┖闂磋鍗犳弧鍚庯紝浣 鍐嶅畨瑁匒PP鏃朵細鍑虹幇鏃犵┖闂村畨瑁呯殑鎶ラ敊鎻愮ず銆傛垜浠鍙浠ュ皢鍏剁悊瑙d負PC C鐩橀噷鐨勨淧rogram Files鈥濇枃浠跺す錛屽彧鏄浣犳墍瀹夎呯殑鎵鏈夌▼搴忛粯璁ゅ彧鑳藉畨瑁呬簬姝や笖鏃犳硶淇鏀硅礬寰勩傗滅郴緇熷垎鍖猴紜紼嬪簭鍒嗗尯鈥濈殑鎬誨拰灝辨槸鐢佃剳C鐩樼殑鍏ㄩ儴絀洪棿銆 銆銆瀛樺偍鍒嗗尯----榪欐墠鏄褰撴墜鏈鴻繛鎺PC鍚庢墍璇嗗埆 鍑烘潵鐨勨滅Щ鍔ㄧ‖鐩樷濓紝灝忕背3鐨12.38GB鍜岃仈鎯矺900鐨7.88GB灝辨槸瀛樺偍鍒嗗尯銆傝繖閮ㄥ垎絀洪棿鍙浠ョ敱鐢ㄦ埛鑷鐢辨敮閰嶏紝鍙瀛樻斁澶у瀷娓告垙鐨勬暟鎹鍖呫侀煶涔愩 鍥劇墖銆佽嗛戱紝鍙鍍廢鐩樹竴鏍烽殢鎰忔姌鑵俱傛崲鍋歅C棰嗗煙錛屽瓨鍌ㄥ垎鍖哄氨濂戒技D鐩樸丒鐩樸丗鐩樼瓑闈炵郴緇熷垎鍖恆 緋葷粺鍒嗗尯鍜岀▼搴忓垎鍖猴紝鉶界劧鏃犳硶琚鐢ㄦ埛鐩存帴鍒╃敤錛屼絾鍗存壙鎷呯潃闈炲父閲嶈佺殑瑙掕壊銆
C. android系統大概佔多大的內存那
不是的。不知樓主說的是內存卡還是手機內存。首先要說明,卡上說的是8G,實際只能用7G多。因為生產廠家採用1000為單位,而手機讀取採用1024未單位,所以有誤差。我的android 手機由於有導航,導航佔用了1.5G多。實際系統文件只有幾百M。
D. Android系統內存管理
部分內容出至林學森的Android內核設計思想。
Android官網內存管理
部分出至 https://www.jianshu.com/p/94d1cd553c44
Android本質是Linux所以先從Linux說起。
Linux的內存管理為系統中所有的task提供可靠的內存分配、釋放和保護機制。
核心:
虛擬內存
內存分配與釋放
內存保護
將外存儲器的部分空間作為內存的擴展,如從硬碟劃出4GB大小。
當內存資源不足時,系統按照一定演算法自動條形優先順序低的數據塊,並把他們存儲到硬碟中。
後續如果需要用到硬碟中的這些數據塊,系統將產生「缺頁」指令,然後把他們交換回內存中。
這些都是由操作系統內核自動完成的,對上層應用」完全透明「。
每個進程的邏輯地址和物理地址都不是直接對應的,任何進程都沒辦法訪問到它管轄范圍外的內存空間——即刻意產生的內存越界與非法訪問,操作系統也會馬上阻止並強行關閉程序,從而有力的保障應用程序和操作系統的安全和穩定。
一旦發現系統的可用內存達到臨界值,機會按照優先順序順序,匆匆低到高逐步殺掉進程,回收內存。
存儲位置:/proc/<PID>/oom_score
優先順序策略:
進程消耗的內存
進程佔用的CPU時間
oom_adj(OOM權重)
Android平台運行的前提是可用內存是浪費的內存。它試圖在任何時候使用所有可用的內存。例如,系統會在APP關閉後將其保存在內存中,以便用戶可以快速切換回它們。出於這個原因,Android設備通常運行時只有很少的空閑內存。在重要系統進程和許多用戶應用程序之間正確分配內存內對存管理是至關重要。
Android有兩種主要的機制來處理低內存的情況:內核交換守護進程(kernel swap daemon)和低內存殺手(low-memory killer)。
當用戶在APP之間切換時,Android會在最近使用的(LRU)緩存中保留不在前台的APP,即用戶看不到的APP,或運行類似音樂播放的前台服務。如果用戶稍後返回APP,系統將重用該進程,從而使APP切換更快。
如果你的APP有一個緩存進程,並且它保留了當前不需要的內存,那麼即使用戶不使用它,你的APP也會影響系統的整體性能。由於系統內存不足,它會從最近使用最少的進程開始殺死LRU緩存中的進程。該系統還負責處理佔用最多內存的進程,並可以終止這些進程以釋放RAM。
當系統開始終止LRU緩存中的進程時,它主要是自底向上工作的。系統還考慮哪些進程消耗更多的內存,從而在終止時為系統提供更多的內存增益。你在LRU列表中消耗的內存越少,你就越有可能留在列表中並能夠快速恢復。
為了滿足RAM的所有需求,Android嘗試共享RAM來跨進程通信。它可以做到以下方式:
Android設備包含三種不同類型的內存:RAM、zRAM和storage。
注意:CPU和GPU都訪問同一個RAM。
內存被拆分成頁。通常每頁有4KB的內存。
頁面被認為是空閑的或已使用的。
空閑頁是未使用的RAM。
已使用頁是系統正在積極使用的RAM,分為以下類別:
干凈的頁面(Clean pages)包含一個文件(或文件的一部分)的一份精確副本存在存儲器上。當一個干凈的頁面不再包含一個精確的文件副本(例如,來自應用程序操作的結果)時,它就變成了臟頁。可以刪除干凈的頁,因為它們始終可以使用存儲中的數據重新生成;不能刪除臟頁(Dirty pages),否則數據將丟失。
內核跟蹤系統中的所有內存頁。
當確定一個應用程序正在使用多少內存時,系統必須考慮shared pages。APP訪問相同的服務或庫將可能共享內存頁。例如,Google Play Services 和一個游戲APP可能共享一個位置服務。這使得很難確定有多少內存屬於這個服務相對於每個APP。
當操作系統想要知道所有進程使用了多少內存時,PSS非常有用,因為頁面不會被多次計數。PSS需要很長時間來計算,因為系統需要確定哪些頁面是共享的,以及被有多少進程。RSS不區分共享頁面和非共享頁面(使計算速度更快),更適合於跟蹤內存分配的更改。
內核交換守護進程(kswapd)是Linux內核的一部分,它將使用過的內存轉換為空閑內存。當設備上的空閑內存不足時,守護進程將變為活動狀態。Linux內核保持低和高的可用內存閾值。當空閑內存低於低閾值時,kswapd開始回收內存。當空閑內存達到高閾值,kswapd將停止回收內存。
kswapd可以通過刪除干凈的頁面來回收干凈的頁面,因為它們有存儲器支持並且沒有被修改。如果進程試圖定址已刪除的干凈頁,則系統會將該頁從存儲器復制到RAM。此操作稱為請求分頁。
kswapd將緩存的私有臟頁(private dirty pages)和匿名臟頁(anonymous dirty pages)移動到zRAM進行壓縮。這樣做可以釋放RAM中的可用內存(空閑頁)。如果進程試圖觸摸zRAM中臟頁,則該頁將被解壓縮並移回RAM。如果與壓縮頁關聯的進程被終止,則該頁將從zRAM中刪除。
如果可用內存量低於某個閾值,系統將開始終止進程。
lmkd實現源碼要在system/core/lmkd/lmkd.c。
lmkd會創建名為lmkd的socket,節點位於/dev/socket/lmkd,該socket用於跟上層framework交互。
小結:
LMK_TARGET: AMS.updateConfiguration() 的過程中調用 updateOomLevels() 方法, 分別向/sys/mole/lowmemorykiller/parameters目錄下的minfree和adj節點寫入相應信息;
LMK_PROCPRIO: AMS.applyOomAdjLocked() 的過程中調用 setOomAdj() 向/proc/<pid>/oom_score_adj寫入oom_score_adj後直接返回;
LMK_PROCREMOVE: AMS.handleAppDiedLocked 或者 AMS.() 的過程,調用remove(),目前不做任何事,直接返回;
為了進一步幫助平衡系統內存並避免終止APP進程,可以Activity類中實現ComponentCallbacks2介面。提供的onTrimMemory()回調方法允許APP在前台或後台偵聽與內存相關的事件,然後釋放對象以響應應用程序生命周期或表明系統需要回收內存的系統事件。
onTrimMemory()回調是在Android 4.0(API級別14)中添加的。
對於早期版本,可以使用onLowMemory(),它大致相當於TRIM_MEMORY_COMPLETE事件。
一個專門的驅動。(Linux Kernel 4.12 已移除交給kswapd處理)。
很多時候,kswapd無法為系統釋放足夠的內存。在這種情況下,系統使用onTrimMemory()通知APP內存不足,應該減少其分配。如果這還不夠,內核將開始終止進程以釋放內存,它使用低內存殺手(LMK)來完成這個任務。
為了決定要終止哪個進程,LMK使用一個名為oom_adj_score的「out of memory」分數來確定運行進程的優先順序,高分的進程首先被終止。
後台應用程序首先被終止,系統進程最後被終止。
下表列出了從高到低的LMK評分類別。第一排得分最高的項目將首先被殺死:
Android Runtime(ART)和Dalvik虛擬機使用分頁(Paging)和內存映射(mmapping)來管理內存。應用程序通過分配新對象或觸摸已映射頁面來修改內存都將保留在RAM中,並且不能被調出。應用程序釋放內存的唯一方式是垃圾收集器。