优势
我们通常用的是SP框架,它的get性能是很高的,因为做了内存缓存
但是其commit、apply就不尽如人意了
apply会入队任务,Activity、Broadcast、Service的生命周期会等待队列清空,引起ANR
很多时候业务的实时性要求非常高,commit是必须采用的,但是SP的commit的性能是堪忧的,使用了后可以看到肉眼可见的卡顿
图中可以看到MMKV和SP写性能的对比,相差了将近100倍
其次跨进程、稳定性都做得非常优越
所以MMKV非常值得使用
功能简介
1、mmap
通过mmap映射内存文件,提供一块随时可写入的内存块,App可以往里面写消息,由OS把内存写到文件,不必担心crash引起的内存丢失
仅在操作时映射,mmap只是设置了文件-虚拟地址的映射,没有实际分配内存,只有实际操作的时候,内核会中断,进行内存分配、IO操作
2、序列化
采用Protobuf
3、写优化
key-value数据,会进行缓存,每次要写的时候,往序列化的数据的最后增加,保证了最后的数据是最新的
为了防止占用空间无限膨胀,在将满的时候会整合序列化数据
4、多进程能力
本质还是通过mmap实现的多进程
5、匿名内存
对于隐私数据,使用Android Ashmem
6、数据有效性检测
考虑到文件系统和OS有不稳定性,所以假如crc检测
7、数据加密
通过AES CFB-128算法来进行加密
init流程
write流程
read流程
总结
核心逻辑在C层,直接操作内存
1、利用了mmap的特性:内存和文件进行映射,这样操作内存,可以反应到文件上,同时文件被操作,也可以反应到内存上
这样就不必调用read、write了
2、为了优化写效率,不断往内存尾部追加新值,保证尾端是最新的
同时为了避免过度扩张,平衡空间与性能,定期整合文件
3、使用Protobuf优化序列化能力
这3点是高性能的一部分原因。
多进程是通过mmap实现的,mmap天生适合做跨进程,Binder也是基于此操作实现的跨进程。
可优化的点
1、MMKV的get操作未必比SP好,因为它涉及JNI操作,还包含数据转型操作。而SP是直接取的内存缓存。所以可以在MMKV上封一层,增加内存缓存
2、mmap对内存消耗很大,就算只有一个字段,占用的内存也是4k,对这部分要充分优化
后记
有什么写得错误、让人费解或遗漏的地方,希望可以不吝赐教,我会马上更改
学习自
https://www.jianshu.com/p/92bcb77f8eca
https://www.cnblogs.com/huxiao-tee/p/4660352.html
可优化的点和3个流程图参考自同事文章