Android Jetpack DataStore是否存在与SharedPreferences相同的内存限制
问题1:Jetpack DataStore是否存在和Shared Preferences相同的内存约束?
SharedPreferences的内存异常本质是因为它初始化时会把整个XML文件全量加载到静态内存中永久持有,所以文件大小超过1428.51kb阈值时会直接触发内存溢出,DataStore不存在这个硬触发的内存限制。- 但DataStore并非完全没有内存约束:不管是
Preferences DataStore还是Proto DataStore,读取数据时都会将完整的持久化数据反序列化后加载到内存返回,只是它不会像SharedPreferences一样长期静态持有全量数据,读写完成后没有强引用的对象会被GC回收,仅在实际读写大体积数据时才会临时占用对应内存。 - 如果单条存储数据本身达到数MB甚至更大,不管用
SharedPreferences还是DataStore,读取时都可能触发OOM,只是SharedPreferences在初始化阶段就会触发,DataStore仅在主动读取对应数据时才会触发。
问题2:搭配Protocol Buffers使用的DataStore在内存占用层面是否有优势?
是的,搭配Protocol Buffers的Proto DataStore在内存占用上有明显优势:
Protocol Buffers是二进制序列化协议,相同数据结构序列化后的存储体积仅为SharedPreferences使用的XML格式的1/3~1/5,序列化/反序列化速度更快,对应运行时内存占用更低。Proto DataStore是强类型存储,不需要像SharedPreferences或者Preferences DataStore一样存储额外的key字符串、类型标记等冗余信息,进一步减少了存储体积和运行时内存开销。Proto DataStore反序列化后直接生成自定义类型对象,不会用HashMap持有全量键值对,省去了HashMap本身的负载因子冗余、Entry对象额外内存开销,运行时内存占用会进一步降低。
内容的提问来源于stack exchange,提问作者Sharan
相关产品推荐
相关产品推荐

