博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android内存优化发展——使用软引用
阅读量:5886 次
发布时间:2019-06-19

本文共 3248 字,大约阅读时间需要 10 分钟。

  整个Android开发者一定是遇到了内存溢出这个头疼的问题,一旦这个问题。很难直接决定我们的应用程序是哪里出了问题,为了找到问题的解决方案,必须累积发行通过一些内存分析工具高速定位和强大的体验,现在详细那里能力。

  具有此功能基于手机开发,低内存消耗的原则。以及我近期遇到的内存堆积(偶尔溢出)问题,总结一下这次解决问题的经验。

  问题源头:開始App功能没那么多的时候,是没有注意到这个问题的。后来功能越强越多。图片也越来越多的时候,用ADT自带的Allocation Tracker查看了一下内存分配,明显有很多没用的data object,而没有释放掉。開始以为是universalImageLoader的问题,以为这个开源project对图片的载入有问题,后来把图片全去掉再看内存分配时还是有没用的data object,花了两天时间后发现是,是自己本地的一些bitmap没有回收,一直缓存在内存中。还有一个原因就是前面文章提到的,为了实现退出功能。使用了一个全局的ArrayList去存储全部新启动的Activity,导致Activity这样的大对象无法释放,有这两个问题内存不堆积才有问题。

  定位到问题的所在后,先用前面的广播方式替换掉之前的那种方案,这样就攻克了问题的一半了,那本地图片怎样处理呢?就上网查看了一些文章。看到很多大神都说到了软引用这个东东。于是就研究了下软引用怎样使用。

发现这软引用的确是个好东西。的确能够优化整个应用对内存的消耗。

  从JDK1.2開始。java将对象分成了四种级别,以达到程序对对象生財周期的灵活控制,这四个级别由强到弱是:强引用,软引用。弱引用,虚引用。强引用就不多说了。就是我们平时直接new出来的一个对象,不做不论什么的修饰,就是强引用。虚引用暂未使用过也就没做过深入了解,弱引用的使用方式基本和软引用是一样的,所以就重点看了一下应用程序怎样使用软引用。

  假设一个对象仅仅具有软引用,那么假设内存假设够用的话,GC就不会回收它,假设内存不足了,就会优先回收仅仅有软引用的对象内存,而保证不会内存溢出。

基于软引用的这个特性。我们能够使用软引用来实现内存敏感区的快速缓存。因此为了防止内存溢出的发生,在处理一些占用内存较大且声明周期较长的对象的时候,我们能够尽量使用软引用,比如: Context及其子类对象。Drawable及其子类对象,Bitmap位图对象等,在创建这些类的对象的时候。尽量将其声明为软引用。

  软引用对象声明: SoftReference<Class> instance;

  以下两个样例是我在项目中实际使用的代码。大家能够看下。

          

//这个样例是用来处理生命周期较长的大对象 /********************************************************** * @文件名:ActivityManager.java * @创建时间:2014年11月6日 上午11:38:23 * @文件描写叙述:Activity管理类 * @改动历史:2014年11月6日创建初始版本号 **********************************************************/public class ActivityManager{	private static ActivityManager manager = null;	private static HashMap
> activityMap; // 静态语句块,在类载入的时候一起运行 static { manager = new ActivityManager(); activityMap = new HashMap
>(); } private ActivityManager() { } public static ActivityManager getInstance() { return manager; } public void put(Activity act) { activityMap.put(act.toString(), new SoftReference
(act)); } public void remove(Activity act) { activityMap.remove(act.toString()); } public void finishAllActivity() { Set
set = activityMap.keySet(); Iterator
iter = set.iterator(); while (iter.hasNext()) { String actName = iter.next(); Activity currentAct = activityMap.get(actName).get(); if (currentAct != null) { currentAct.finish(); currentAct = null; } } activityMap.clear(); activityMap = null; }}

//这个样例是用来处理位图等内存敏感对象演示样例public class BitmapManager{	private static BitmapManager bitmapManager = null;	private static HashMap
> imageCache = null; static { bitmapManager = new BitmapManager(); imageCache = new HashMap
>(); } private BitmapManager() { } public static BitmapManager getInstance() { return bitmapManager; } public static void saveBitmapToCache(String path) { Bitmap bitmap = BitmapFactory.decodeFile(path); // 加入该对象软引用对象到Map中使其缓存 imageCache.put(path, new SoftReference
(bitmap)); // 使用完后手动将位图对象置null bitmap = null; } public static Bitmap queryBitmapByPath(String path) { // 取出软软引用 SoftReference
softBitmap = imageCache.get(path); // 使用时必须推断软引用是否回收,被回收返回空 if (softBitmap == null) { return null; } Bitmap bitmap = softBitmap.get(); return bitmap; }}
 总结一下:当我们开发应用程序,最好是刚开始认识到要考虑到可能发生的帐户问题,这些细节提前做处理好工作,将杜绝从根发生此类问题,而当问题发生在许多其他的能源处理将再次花费。

 

  

转载地址:http://xigix.baihongyu.com/

你可能感兴趣的文章
vim命令学习总结
查看>>
线性表--单链表(C++)
查看>>
mysql 5.7.9 免安装版本
查看>>
【基础技术】Java基础那些事儿系列-成员变量与局部变量
查看>>
0726linux基础内容小记
查看>>
【加密工具】2019年网络安全加密工具排行,好用的计算机加密软件推荐
查看>>
练习题
查看>>
mysql中Timestamp,time,datetime 区别
查看>>
使用Python快速建立FTP服务器
查看>>
Python和Cython有什么关系?
查看>>
bind安装域名解析服务,以及分离服务
查看>>
Netfilter/Iptables Layer7 应用层过滤策略部署
查看>>
12.21 php-fpm的pool 12.22 php-fpm慢执行日志 12.23 open_b
查看>>
如何挂载另一个lvm硬盘
查看>>
安装cobbler
查看>>
第3章 方法的重载及参数传递
查看>>
多选下拉相互切换
查看>>
SSH服务详解
查看>>
小程序--时间处理(显示几分钟前,,几小时前,,几天前...)
查看>>
23种设计模式介绍(三)---- 行为型模式
查看>>