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,加上 ...
随机推荐
- Codeforces 258 Div2
A题,n*m根木棍,相交放置,轮流取走相交的两根,最后谁不能行动,则输掉. min(n,m)&1 为1则先取者赢. B题,给定一个长度为n,且各不相同的数组,问能否通过交换连续一段L....R ...
- [jobdu]数组中出现次数超过一半的数字
找到以后要再扫一遍确认. http://zhedahht.blog.163.com/blog/static/25411174201085114733349/ #include <iostream ...
- strspn和strcspn妙用
http://blog.csdn.net/aidenliu/article/details/5460201
- [unity菜鸟] controller.SimpleMove(transform .forward); 无法移动
今天做demo时遇到一个问题:当使用角色控制器操作物体,用 controller.SimpleMove(transform .forward); 语句时物体不能移动,搜索请教了很久,最后终于googl ...
- RxJava开发精要2-为什么是Observables?
原文出自<RxJava Essentials> 原文作者 : Ivan Morgillo 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转 ...
- 【Python Network】分解DNS查询结果
针对DNS查询records,通过NS.PTR.CNAME和MX类别不同,返回数据将包含另外主机名.为了解最终的IP地址,通过将返回信息分解.继续使用PyDNS获取详细信息. #! /usr/bin/ ...
- 对XX证券报关于物联网操作系统的几个问题的答复
XX证券报提问了几个关于物联网和物联网操作系统的问题,个人表达了一些粗陋的观点,在这里发表出来,与行业朋友交流和探讨. 物联网行业最需要解决的问题是什么? 虽然物联网这个行业被炒得比较热,但是截至目前 ...
- linux 系统获取网络ip, mask, gateway, dns信息小程序
net_util.c #define WIRED_DEV "eth0" #define WIRELESS_DEV ...
- Dispatcher及线程操作
WPF 应用程序启动后,会有两个线程: 1. 一个是用来处理UI呈现(处理UI的请求,比如输入和展现等操作). 2. 一个用来管理 UI的 (对UI元素及整个UI进行管理). WPF在线程里面是不可以 ...
- 【HTML】Advanced3:Tables: Columns, Headers, and Footers
1. <table> <colgroup> <col> <col class="alternative"> <col> ...