“手機內存越大,運行速度越快”這個觀點似乎已經在大家的心里根深蒂固很久了。宏觀上看,內存越大,可以被存放的數據越多,存儲器件上需要讀取的數據量也會隨之下降。但是內存大了之后,為什么還是會有卡頓現象呢?這就要從內存數據類型與管理方式上說起。

手機內存中存放的數據可大致分成兩類
一類是文件類型數據(或叫文件頁數據),其中包含了圖片數據,文件數據,程序執行的代碼文件等等。另一類是匿名類型數據(或叫匿名頁數據),主要存放代碼執行過程的臨時變量數據(為啥叫匿名啊?因為匿名頁數據沒來源啊,慘~)。

當內存不足時,就要從這兩類數據開刀
文件頁數據多數為只讀數據,同時在存儲器件上有備份。因此,內存管理機制喜歡回收文件頁數據(沒辦法呢,欺負弱小嘛)。
匿名頁數據都是程序運行時產生的,一旦丟了就沒有了,所以匿名頁數據的地位高一些。當然強大的內存管理者也不會放任匿名頁這個家伙慢慢做大,在手機平臺上,就采用了數據壓縮的方式,把匿名頁數據壓縮,節省內存空間。

內存回收管理過程中的煩惱
從回收手段上看,文件頁數據在沒有弄臟的(有臟數據)情況下丟掉就好了,回收的成本比較低,可以近似看成是空閑的內存。咱們手機上清后臺時候看到的可用內存其實就是文件頁數據加上內存空閑空間的總和。所以,當你看到可用內存很多,但是還是有卡頓感覺的時候,不要詫異哦。因為那是算了文件頁面之后的內存統計量,并不是完全空閑的內存統計量。

那么兄弟們肯定要問了,反正前面說文件頁面的回收速度很快嘛,所以可用內存高,程序運行應該也很快啊。這里就涉及到一個關鍵問題了,文件頁面回收真的沒有開銷嗎?
第一種情況,已經被扔掉的文件頁面數據,短期內可能不會用到了,這個時候確實扔掉文件數據性能會好。
但第二種情況下,如果扔掉的文件頁很快就會用到呢?這個時候,這些數據就要從存儲器件重新讀取,這個開銷可是不小。這個就像是你去銀行貸款,乍一看你似乎很快拿到了很多的錢,但是由于這個東西是有利息的,隨著你借的錢越多,那么你還的利息就要越多。如果還不上,你就可能去別的銀行借錢(影響別的程序執行)。最后就會由于錢還不上,就把系統卡住了,這里利息就是IO開銷。

既然回收文件頁面有這個風險,那就走匿名頁回收嘛,一個想法油然而生從心底想起。匿名頁回收需要進行數據壓縮。“來來來,交給我”CPU在旁邊搖旗吶喊,目前數據壓縮需要使用占用一部分CPU算力。當然,以現在的CPU算力來看,數據壓縮對用戶性能的影響是微乎其微的。然而,這玩意費電啊,同時,手機也燙手啊。為了能夠盡快的把數據壓縮出來,CPU跟打了雞血一樣,把自己調整成高頻狀態,盡快完成工作。

要是這樣,內存管理不就是無解了嗎?
哎,終于了解研發人員的痛苦了吧?但是研發人員是不會也不能向困難屈服!現在就給大家介紹下EMUI 10的智能內存管理引擎的工作原理。
夾縫中需求最優解,引入器件性能評價體系,將存儲器件性能,CPU性能功耗納入考量范圍,動態調節內存回收機制,平衡文件頁與匿名頁數據回收比例。在硬件內存配置降低場景下,也能確保流暢的用戶體驗,大幅降低由于內存供給不足或者內存浪費帶來的系統性能二次創傷。
首次加入軟件特征識別模塊,能夠在線識別軟件訪存行為的特征,針對訪存的連續性,Burst 特性與訪存混合比例構建內存行為模型,為不同的應用提供精準的內存供給。

同時,為了提升內存的利用率,智能內存管理引擎在線識別數據的冷熱特性,能夠將長期未使用的數據進行聚攏,并剔除內存。程序對數據的訪問就像人對周圍事物的感知一樣,多數事物都是只圖一時新鮮。而這些一時新鮮的東西卻會占用手機的內存,不斷消耗著內存那脆弱的心靈。智能內存管理引擎提供冷熱數據解析功能,替您識別并剔除路邊野花。讓您在手機道路上流暢無阻。
除此之外,綜合考慮存儲器件與內存空間之間的權衡,結合應用啟動的文件訪問特性,實現了在線自學習的文件預讀機制,以最小的代價,完成文件頁數據的高速加載。總而言之,就是用起來爽~
內存管理是個硬骨頭,但是誰讓我們就是技術狗呢,就是愛啃硬骨頭!