Android Image Loader 第三方库对比测试

##预热知识
测试前,我们需要先明白这样一个问题

Java Heap / Native Heap 各自代表什么?
Bitmap 到底是分配在Java heap上 还是分配到了Native heap上
Java Heap 大小一般是多大,有限制吗?
Native Heap大小一般是多大,有限制吗?
Java OOM 一般是发生在什么时候,和Java Heap有关还是和 Native Heap有关

如果以上问题不是很清楚的话可以参考这个链接,自己恶补一下基础知识:Android进程的内存管理分析

关于上面的几个问题,这里可以小结一下:

Java Heap是对于Java 虚拟机而说的,一般的大小上限是 16M 24M 48M 76M 具体视手机而定。
Native Heap是对于C/C++直接操纵的系统堆内存,所以它的上限一般是具体RAM的2/3左右。
所以对于2G的手机而言,Java Heap 大概76M,而Native Heap是760M左右,相差10倍。

那么Android为啥这么吝啬,给Java Heap分配了这么点内存呢?

Google 既然这么做了,自然有他的道理: 这样设计的目的是为了让Android系统能同时让比较多的进程常驻内存,这样程序启动时就不用每次都重新加载到内存,能够给用户更快的响应。迫使每个应用程序使用较小的内存,移动设备非常有限的RAM就能使比较多的app常驻其中。

我们知道在大多数的Android APP中OOM大多数发生在加载多图片的时候,而很多人会认为Bitmap的实例构造是在JNI层完成的,所以也应该在Native层才对,其实不对,虽然在Native层完成,但是Bitmap的实例构造还是通过Android的虚拟机环境完成的,所以还是在Java Heap中。

##对比测试
上面几个问题回答清楚了,接下来我们看看迄今为止比较火的几个Image Loader库

###初始化状态
此处输入图片的描述
###Fresco
此处输入图片的描述
###Glide
此处输入图片的描述
###UIL
此处输入图片的描述
###Volley
此处输入图片的描述
###Fresco+OkHttp
此处输入图片的描述
###Picasso
此处输入图片的描述

##小结
这里需要说清楚的是,其中并非都是静态图,还有大量的Gif动态图,所以,评测的平均加载时间就不太客观了,我们重点看一下上面我们提及的几个概念:

Java Heap 和 Native Heap
从上面的测试可以看出: Frasco/Frasco + OkHttp 表现的和其他几个迥异,前者会动态调整Native Heap而基本保持Java Heap 稳定, 其他几个是相反的。而Java Heap的增长会直接导致OOM的出现。所以可以肯定的说 Frasco可以有效的避免OOM,同时 Frasco还可以显示动态图以及其他特性

基于以上的测试可以发现,孰优孰劣, 一辩便知。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值