Android Image Loader 第三方库对比测试
2016-01-05 15:03
309 查看
转载自:http://blog.csdn.net/linux1s1s/article/details/46959649
测试前,我们需要先明白这样一个问题
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库
![](http://7xinl9.com1.z0.glb.clouddn.com/linux1s1scb30e160-bfa4-47ca-af5c-fa866bbb4aa6.png)
![](http://7xinl9.com1.z0.glb.clouddn.com/linux1s1s6ff7495a-0263-4f54-b2f6-0fb6b88814a4.png)
![](http://7xinl9.com1.z0.glb.clouddn.com/linux1s1s8e260433-93f4-428f-af56-ff2ba227585f.png)
![](http://7xinl9.com1.z0.glb.clouddn.com/linux1s1sbfa40181-390d-4dbe-8676-cbfabe76f5f6.png)
![](http://7xinl9.com1.z0.glb.clouddn.com/linux1s1sd61f22cb-1e3e-480e-876f-5d03110661d4.png)
![](http://7xinl9.com1.z0.glb.clouddn.com/linux1s1sdb7b3112-ba7d-4165-90e8-05350f14c4f8.png)
![](http://7xinl9.com1.z0.glb.clouddn.com/linux1s1seedaf096-ad3e-4f28-a356-a533c50b6378.png)
这里需要说清楚的是,其中并非都是静态图,还有大量的Gif动态图,所以,评测的平均加载时间就不太客观了,我们重点看一下上面我们提及的几个概念:
Java Heap 和 Native Heap
从上面的测试可以看出: Frasco/Frasco + OkHttp 表现的和其他几个迥异,前者会动态调整Native Heap而基本保持Java Heap 稳定, 其他几个是相反的。而Java Heap的增长会直接导致OOM的出现。所以可以肯定的说 Frasco可以有效的避免OOM,同时 Frasco还可以显示动态图以及其他特性
基于以上的测试可以发现,孰优孰劣, 一辩便知。
预热知识
测试前,我们需要先明白这样一个问题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库
初始化状态
![](http://7xinl9.com1.z0.glb.clouddn.com/linux1s1scb30e160-bfa4-47ca-af5c-fa866bbb4aa6.png)
Fresco
![](http://7xinl9.com1.z0.glb.clouddn.com/linux1s1s6ff7495a-0263-4f54-b2f6-0fb6b88814a4.png)
Glide
![](http://7xinl9.com1.z0.glb.clouddn.com/linux1s1s8e260433-93f4-428f-af56-ff2ba227585f.png)
UIL
![](http://7xinl9.com1.z0.glb.clouddn.com/linux1s1sbfa40181-390d-4dbe-8676-cbfabe76f5f6.png)
Volley
![](http://7xinl9.com1.z0.glb.clouddn.com/linux1s1sd61f22cb-1e3e-480e-876f-5d03110661d4.png)
Fresco+OkHttp
![](http://7xinl9.com1.z0.glb.clouddn.com/linux1s1sdb7b3112-ba7d-4165-90e8-05350f14c4f8.png)
Picasso
![](http://7xinl9.com1.z0.glb.clouddn.com/linux1s1seedaf096-ad3e-4f28-a356-a533c50b6378.png)
小结
这里需要说清楚的是,其中并非都是静态图,还有大量的Gif动态图,所以,评测的平均加载时间就不太客观了,我们重点看一下上面我们提及的几个概念:Java Heap 和 Native Heap
从上面的测试可以看出: Frasco/Frasco + OkHttp 表现的和其他几个迥异,前者会动态调整Native Heap而基本保持Java Heap 稳定, 其他几个是相反的。而Java Heap的增长会直接导致OOM的出现。所以可以肯定的说 Frasco可以有效的避免OOM,同时 Frasco还可以显示动态图以及其他特性
基于以上的测试可以发现,孰优孰劣, 一辩便知。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories