Android MMKV 原理简述

在Android开发中,有一个常用的轻量数据保存工具:SharedPreferences(简称SP)

关于SharedPreferences:

  • SharedPreferences运用IO流读写文件的方式保存数据

IO流写文件需要经过二次拷贝:

①从用户空间写入内核空间需要CPU拷贝

②从内核空间写入磁盘需要DMA拷贝

  • SharedPreferences是全量更新,若数据过大,则耗时大大增加

  • SharedPreferences之所以不能保存大数据,是因为有可能造成 子线程 阻塞 主线程 的情况(内部有锁)

final class SharedPreferencesImpl implements SharedPreferences {
    private final Object mLock = new Object();  // 锁对象
    private boolean mLoaded = false; // 读写状态标识符

    private void startLoadFromDisk() {
        synchronized (mLock) {
            mLoaded = false;
        }
        new Thread("SharedPreferencesImpl-load") {
            public void run() {
                loadFromDisk();
            }
        }.start();
    }

    // 从SP中读写数据时都会调用这个方法,数据越多,等待加载的时间就会越长
    private void awaitLoadedLocked() {
        if (!mLoaded) {
            BlockGuard.getThreadPolicy().onReadFromDisk();
        }
        while (!mLoaded) {
            try {
                mLock.wait();
            } catch (InterruptedException unused) {
            }
        }
        if (mThrowable != null) {
            throw new IllegalStateException(mThrowable);
        }
    }

}

关于MMKV:

  • mmkv运用了零拷贝技术(mmap)

mmap:用户空间和内核空间的虚拟内存映射到同一块物理内存中,只需要一次拷贝

  • mmkv是增量更新

  • mmkv通过Protobuf的方式进行序列化

protobuf:以纯字节的形式去保存数据,更节省内存


总结:

SP写入数据:用户空间拷贝一份数据(xml文件)到内核空间,内核空间再拷贝一份到磁盘中

MMKV写入数据:用户空间的虚拟内存映射一块物理内存,内核空间的虚拟内存也映射于此,这样用户空间对此物理内存操作后,内核空间也能访问到此数据,再拷贝一份到磁盘中。且mmkv是以字节的方式保存

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值