android内存优化发展——使用软引用
整个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<String, SoftReference<Activity>> activityMap; // 静态语句块,在类载入的时候一起运行
static
{
manager = new ActivityManager();
activityMap = new HashMap<String, SoftReference<Activity>>();
} private ActivityManager()
{ } public static ActivityManager getInstance()
{
return manager;
} public void put(Activity act)
{
activityMap.put(act.toString(), new SoftReference<Activity>(act));
} public void remove(Activity act)
{
activityMap.remove(act.toString());
} public void finishAllActivity()
{
Set<String> set = activityMap.keySet();
Iterator<String> 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<String, SoftReference<Bitmap>> imageCache = null; static
{
bitmapManager = new BitmapManager();
imageCache = new HashMap<String, SoftReference<Bitmap>>();
} 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>(bitmap));
// 使用完后手动将位图对象置null
bitmap = null;
} public static Bitmap queryBitmapByPath(String path)
{
// 取出软软引用
SoftReference<Bitmap> softBitmap = imageCache.get(path);
// 使用时必须推断软引用是否回收,被回收返回空
if (softBitmap == null)
{
return null;
}
Bitmap bitmap = softBitmap.get(); return bitmap;
} }
总结一下:当我们开发应用程序,最好是刚开始认识到要考虑到可能发生的帐户问题,这些细节提前做处理好工作,将杜绝从根发生此类问题,而当问题发生在许多其他的能源处理将再次花费。
android内存优化发展——使用软引用的更多相关文章
- [Android] Android开发优化之——使用软引用和弱引用
Java从JDK1.2版本开始,就把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 这里重点介绍一下软引用和弱引用. ...
- Android开发优化之——使用软引用和弱引用
Java从JDK1.2版本开始,就把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 这里重点介绍一下软引用和弱引用. 如果 ...
- 【腾讯Bugly干货分享】Android内存优化总结&实践
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/2MsEAR9pQfMr1Sfs7cPdWQ 导语 智 ...
- ANDROID内存优化——大汇总(转)
原文作者博客:转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! ANDROID内存优化(大汇总——上) 写在最前: 本文的思路主要借鉴了20 ...
- Android内存优化之——static使用篇(使用MAT工具进行分析)
这篇文章主要配套与Android内存优化之——static使用篇向大家介绍MAT工具的使用,我们分析的内存泄漏程序是上一篇文章中static的使用内存泄漏的比较不容易发现泄漏的第二情况和第三种情况—— ...
- ANDROID内存优化(大汇总——中)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上 ...
- android 内存优化一
常见内存泄露原因 Context对象泄漏 1.如果一个类持有Context对象的强引用,就需要检查其生存周期是否比Context对象更长.否则就可能发生Context泄漏. 2.View持有其创建所在 ...
- Android内存优化(三)详解内存分析工具MAT
前言 在这个系列的前四篇文章中,我分别介绍了DVM.ART.内存泄漏和内存检测工具的相关知识点,这一篇我们通过一个小例子,来学习如何使用内存分析工具MAT. 1.概述 在进行内存分析时,我们可以使用M ...
- Android内存优化大全(中)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上 ...
随机推荐
- 保护模式下GDTR,LDTR,全局描述符表,局部描述符表和选择器的关系
这张图要注意:右边两个0-15,其中上面的是LDTR, 下面的是选择子. 图下第五个标线,是两个线交叉的,实际上第五个线是指向右边水平的那个线. 没有箭头的两组线分别表示GDT的区间,LDT的区间 ...
- easyui源码翻译1.32--Dialog(对话框窗口)
前言 扩展自$.fn.window.defaults.使用$.fn.dialog.defaults重写默认值对象.下载该插件翻译源码 该对话框是一种特殊类型的窗口,它在顶部有一个工具栏,在底部有一个按 ...
- 11个强大的Visual Studio调试小技巧(转)
简介 调试是软件开发周期中很重要的一部分.它具有挑战性,同时也很让人疑惑和烦恼.总的来说,对于稍大一点的程序,调试是不可避免的.最近几年,调试工具的发展让很多调试任务变的越来越简单和省时. 这篇文章总 ...
- Oracle系列之存储过程
涉及到表的处理请参看原表结构与数据 Oracle建表插数据等等 判断是否是素数: create or replace procedure isPrime(x number) as flag ; be ...
- SSH框架应用中常用Jar包用途介绍
struts2需要的几个jar包:1)xwork-core-2.1.62)struts2-core-2.1.83)ognl-2.7.34)freemarker-2.3.155)commons-io-1 ...
- 更新你的jar包
jar文件:/home/resin.jar需更新包中com/caucho/server/port/Port.class类文件 方法1:jar uf resin.jar com/caucho/serve ...
- mac 上iterm终端显示中文为乱码解决方案
1.首先需要去设置下iterm,的终端编码方式为utf-8 检查方案为:iterm - > perferences - > Terminal ->Character Encoding ...
- MS-DOS 7.10完整安装版(含图文安装程序)
大家知道,要想学习或使用DOS,安装一个DOS并进行实际操作是非常必要的.MS-DOS 7.10是一个非常好且强大实用的操作系统,而且兼容性和性能都十分强.要在系统中安装MS-DOS 7.10,可以使 ...
- 用JavaScript(js)对时间格式化
Date.prototype.format =function(format) { var o = { "M+" : (this.getMo ...
- InstallShield2008脚本安装制作方法Setup
//=========================================================================== // // File Name: S ...