小对象优化我们集中在字段优化、业务优化、缓存优化三个纬度,不同的纬度有不同的优化策略 。
文章插图
图 15. 小对象优化思路
# 通用类优化
在抖音的业务中,视频是最核心且通用的 Model,抖音业务层的数据存储分散在各个业务维护了各自视频的 Model,Model
本身由于聚合了各个业务需要的属性很多导致单个实例内存占用就不低,随着用户使用过程实例增长内存占用越来越大 。对 Model
本身我们可以从属性优化和拆分这两种思路来优化 。
* 字段优化:针对一次性的属性字段,在使用完之后及时清理掉缓存,比如在视频 Model 内部存在一个 Json 对象,在反序列完成之后 Json 对象就没有使用价值了,可以及时清理 。
* 类拆分:针对通用 Model 冗杂过多的业务属性,尝试对 Model 本身进行治理,将各个业务线需要用到的属性进行梳理,将 Model 拆分成多个业务 Model 和一个通用 Model,采用组合的方式让各个业务线最小化依赖自己的业务 Model,减少大杂烩 Model 不必要的内存浪费 。
# 业务优化
* 按需加载:抖音这边 IM 会全局保存会话,App 启动时会一次性 Load 所有会话,当用户的会话过多时相应全局占用的内存就会较大,为了解决该问题,会话列表分两次加载,首次只加载一定数量到内存,需要时再加载全部 。
* 内存缓存限制或清理:首页推荐列表的每一次 Loadmore 操作,都不会清理之前缓存起来的视频对象,导致用户长时间停留在推荐 Feed 时,缓存起来的视频对象过多会导致内存方面的压力 。在通过实验验证不会对业务产生负面影响情况下对首页的缓存进行了一定数量的限制来减小内存压力 。
# 缓存优化
上面到的视频 Model,抖音最早使用 Manager 来管理通用的视频实例 。Manager 使用 HashMap
存储了所有的视频对象,最初的方案里面没有对内存大小进行限制且没有清除逻辑,随着使用时间的增加而不断膨胀,最终出现 OOM 异常 。为了解决视频 Model
无限膨胀的问题设计了一缓存框架主要流程如下:
文章插图
图 16. 视频缓存框架
使用 LRU 缓存机制来缓存视频对象。在内存中缓存最近使用的 100
个视频对象,当视频对象从内存缓存中移除时,将其缓存至磁盘中 。在获取视频对象时,首先从内存中获取,若内存中没有缓存该对象,则从磁盘缓存中获取 。在退出 App
时,清除 Manager 的磁盘缓存,避免磁盘空间占用不断增长 。
# 图片
关于图片优化,我们主要从图片库的管理和图片本身优化两个方面思考 。同时对不合理的图片使用也做了兜底和监控 。
# 图片库
针对应用内图片的使用状况对图片库设置了合理的缓存,同时在应用 or 系统内存吃紧的情况下主动释放图片缓存 。
# 图片自身优化
我们知道 图片内存大小公式 = 图片分辨率 * 每个像素点的大小。
图片分辨率我们通过设置合理的采样来减少不必要的像素浪费 。
//开启采样ImagePipelineConfig config = ImagePipelineConfig.newBuilder(context) .setDownsampleEnabled(true) .build();Fresco.initialize(context, config);//请求图片时,传入resize的大小,一般直接取View的宽高ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri) .setResizeOptions(new ResizeOptions(50, 50)) .build();mSimpleDraweeView.setController( Fresco.newDraweeControllerBuilder() .setOldController(mSimpleDraweeView.getController()) .setImageRequest(request) .build());
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- 抖音怎么弄配音加原音,抖音视频后期配音怎么弄
- 西瓜视频可以看手机通讯录吗,西瓜视频找通讯录好友
- 皮皮赶海视频,皮皮赶海西瓜视频主页
- 西瓜视 西瓜视频是谁开的
- 怎么删除抖音自己的作品,发表在抖音里的视频怎么删除
- 视频剪切器免费手机版 手机视频剪辑软件哪个好用
- 短视频编剧合作平台 短视频编剧职责
- 免root卸载华为 免root卸载华为视频
- 短视频联盟真的还是假的 全球短视频联盟是不是假的
- 农家朱少新视频 二丫乡村生活西瓜视频