【Android】【框架】【磁盤緩存】【MMKV】

優(yōu)勢

image.png

我們通常用的是SP框架,它的get性能是很高的,因為做了內(nèi)存緩存
但是其commit、apply就不盡如人意了
apply會入隊任務(wù),Activity、Broadcast、Service的生命周期會等待隊列清空,引起ANR
很多時候業(yè)務(wù)的實時性要求非常高,commit是必須采用的,但是SP的commit的性能是堪憂的,使用了后可以看到肉眼可見的卡頓
圖中可以看到MMKV和SP寫性能的對比,相差了將近100倍
其次跨進(jìn)程、穩(wěn)定性都做得非常優(yōu)越
所以MMKV非常值得使用

功能簡介

1、mmap
通過mmap映射內(nèi)存文件,提供一塊隨時可寫入的內(nèi)存塊,App可以往里面寫消息,由OS把內(nèi)存寫到文件,不必?fù)?dān)心crash引起的內(nèi)存丟失
僅在操作時映射,mmap只是設(shè)置了文件-虛擬地址的映射,沒有實際分配內(nèi)存,只有實際操作的時候,內(nèi)核會中斷,進(jìn)行內(nèi)存分配、IO操作
2、序列化
采用Protobuf
3、寫優(yōu)化
key-value數(shù)據(jù),會進(jìn)行緩存,每次要寫的時候,往序列化的數(shù)據(jù)的最后增加,保證了最后的數(shù)據(jù)是最新的
為了防止占用空間無限膨脹,在將滿的時候會整合序列化數(shù)據(jù)
4、多進(jìn)程能力
本質(zhì)還是通過mmap實現(xiàn)的多進(jìn)程
5、匿名內(nèi)存
對于隱私數(shù)據(jù),使用Android Ashmem
6、數(shù)據(jù)有效性檢測
考慮到文件系統(tǒng)和OS有不穩(wěn)定性,所以假如crc檢測
7、數(shù)據(jù)加密
通過AES CFB-128算法來進(jìn)行加密

init流程

image.png

write流程

image.png

read流程

image.png

總結(jié)

核心邏輯在C層,直接操作內(nèi)存
1、利用了mmap的特性:內(nèi)存和文件進(jìn)行映射,這樣操作內(nèi)存,可以反應(yīng)到文件上,同時文件被操作,也可以反應(yīng)到內(nèi)存上
這樣就不必調(diào)用read、write了
2、為了優(yōu)化寫效率,不斷往內(nèi)存尾部追加新值,保證尾端是最新的
同時為了避免過度擴(kuò)張,平衡空間與性能,定期整合文件
3、使用Protobuf優(yōu)化序列化能力
這3點是高性能的一部分原因。
多進(jìn)程是通過mmap實現(xiàn)的,mmap天生適合做跨進(jìn)程,Binder也是基于此操作實現(xiàn)的跨進(jìn)程。

可優(yōu)化的點

1、MMKV的get操作未必比SP好,因為它涉及JNI操作,還包含數(shù)據(jù)轉(zhuǎn)型操作。而SP是直接取的內(nèi)存緩存。所以可以在MMKV上封一層,增加內(nèi)存緩存
2、mmap對內(nèi)存消耗很大,就算只有一個字段,占用的內(nèi)存也是4k,對這部分要充分優(yōu)化

后記

有什么寫得錯誤、讓人費解或遺漏的地方,希望可以不吝賜教,我會馬上更改

學(xué)習(xí)自

http://m.itdecent.cn/p/92bcb77f8eca
https://www.cnblogs.com/huxiao-tee/p/4660352.html
可優(yōu)化的點和3個流程圖參考自同事文章

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • -- 來源于網(wǎng)絡(luò) -- 更詳細(xì)的介結(jié)參考聯(lián)機(jī)幫助文檔 xp_cmdshell--*執(zhí)行DOS各種命令,結(jié)果以文本行...
    overad閱讀 2,561評論 0 13
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,689評論 1 32
  • 今天看到一位朋友寫的mysql筆記總結(jié),覺得寫的很詳細(xì)很用心,這里轉(zhuǎn)載一下,供大家參考下,也希望大家能關(guān)注他原文地...
    信仰與初衷閱讀 4,841評論 0 30
  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 6,026評論 0 9
  • 本文主要有以下三部分內(nèi)容:第一部分:簡單介紹開發(fā)者指南上內(nèi)存相關(guān)的文章。第二部分:總結(jié)移動App性能評測與優(yōu)化內(nèi)存...
    htkeepmoving閱讀 4,270評論 0 5

友情鏈接更多精彩內(nèi)容