现在的位置: 首页 > 综合 > 正文

android有关内存消耗的问题

2014年05月23日 ⁄ 综合 ⁄ 共 1230字 ⁄ 字号 评论关闭

android程序如果发生内存消耗过大的话,会出现很严重的问题,内存消耗主要有几方面:

1,。注册对象未取消:假设我们希望在锁屏界面(LockScreen)中,监听系统中的电话服务以获取一些信息(如信号强度等),则可以在LockScreen中定义一个PhoneStateListener的对象,同时将它注册到TelephonyManager服务中。对于LockScreen对象,当需要显示锁屏界面的时候就会创建一个LockScreen对象,而当锁屏界面消失的时候LockScreen对象就会被释放掉。

  但是如果在释放LockScreen对象的时候忘记取消我们之前注册的PhoneStateListener对象,则会导致LockScreen无法被垃圾回收。如果不断的使锁屏界面显示和消失,则最终会由于大量的LockScreen对象没有办法被回收而引起OutOfMemory,使得system_process进程挂掉

2.资源对象没关闭:如数据库操作的Cursor 或是File文件操作。

3.不良的代码造成的:没有有效的对象没有释放,频繁的申请内存。

4.Bitmap对象没有用recycle()释放。Bitmap对象在不使用时,我们应该先调用recycle()释放内存。

5.构造Adapter时,没有使用缓存的 convertView。getView()的第二个形参 View convertView就是被缓存起来的list item的view对象(初始化时缓存中没有view对象则convertView是null)。

解决:

 View view = null;   
 4 
 5       if (convertView != null) {   
 6 
 7           view = convertView;   
 8 
 9           populate(view, getItem(position));   
10 
11           ...   
12 
13       } else {   
14 
15           view = new Xxx(...);   

判断covertview是否为空 不空就用 空了就new

6.慎用static:

 public class ClassName {  
2 
3       private static Context mContext;  
4 
5       //省略  
6 
7 }
复制代码

  以上的代码是很危险的,如果将Activity赋值到么mContext的话。那么即使该Activity已经onDestroy,但是由于仍有对象保存它的引用,因此该Activity依然不会被释放。

7.线程导致的内存:线程产生内存泄露的主要原因在于线程生命周期的不可控

8.使用软引用和弱引用:如果只是想避免OutOfMemory异常的发生,则可以使用软引用。如果对于应用的性能更在意,想尽快回收一些占用内存比较大的对象,则可以使用弱引用。说白了就是软引用:如果空间够大就继续用,直达到上限,不够大就回收(如定义Hashmap对象,再定义一个添加list里提供使用)而弱引用就是太大了 但还是想用,那么就把大的对象再进行一次声明对象让这个对象指向它,若之前对象null了,但弱引用对象指向的还可以用。

抱歉!评论已关闭.