【Android】【框架】【磁盘缓存】【MMKV】

优势

image.png

我们通常用的是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流程

image.png

write流程

image.png

read流程

image.png

总结

核心逻辑在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个流程图参考自同事文章

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • -- 来源于网络 -- 更详细的介结参考联机帮助文档 xp_cmdshell--*执行DOS各种命令,结果以文本行...
    overad阅读 2,496评论 0 13
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,174评论 1 32
  • 今天看到一位朋友写的mysql笔记总结,觉得写的很详细很用心,这里转载一下,供大家参考下,也希望大家能关注他原文地...
    信仰与初衷阅读 4,769评论 0 30
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,498评论 0 9
  • 本文主要有以下三部分内容:第一部分:简单介绍开发者指南上内存相关的文章。第二部分:总结移动App性能评测与优化内存...
    htkeepmoving阅读 4,171评论 0 5