android 内存优化

本小白从事android的工作两年多,内存的问题是每个项目比较头疼的地方 说说遇见的问题与以前的解决办法。

内存泄漏

Android系统为每个应用程序分配的内存是有限的,而当一个应用中产生的内存泄漏比较多时,这就难免会导致应用所需要的内存超过系统分配的内存限额,这就造成了内存溢出从而导致应用崩溃。

1 单例 单例模式静态特性使得生命周期跟应用程序一样长 导致内存不能正常回收

用到的时候 传入Context,单例的生命周期和应用的一样长 覆盖掉当前的Context() ; 

2、资源未关闭造成的内存泄漏

1)比如在Activity中register了一个BraodcastReceiver,但在Activity结束后没有unregister该BraodcastReceiver。

2)资源性对象比如Cursor,Stream、File文件等往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们,以便它们的缓冲及时回收内存。它们的缓冲不仅存在于 java虚拟机内,还存在于java虚拟机外。如果我们仅仅是把它的引用设置为null,而不关闭它们,往往会造成内存泄漏。

3)对于资源性对象在不使用的时候,应该调用它的close()函数将其关闭掉,然后再设置为null。在我们的程序退出时一定要确保我们的资源性对象已经关闭。

4)Bitmap对象不在使用时调用recycle()释放内存。2.3以后的bitmap应该是不需要手动recycle了,内存已经在java层了。

3 使用ListView时造成的内存泄漏

初始时ListView会从BaseAdapter中根据当前的屏幕布局实例化一定数量的View对象,同时ListView会将这些View对象缓存起来。当向上滚动ListView时,原先位于最上面的Item的View对象会被回收,然后被用来构造新出现在下面的Item。这个构造过程就是由getView()方法完成的,getView()的第二个形参convertView就是被缓存起来的Item的View对象(初始化时缓存中没有View对象则convertView是null)。

构造Adapter时,没有使用缓存的convertView。

解决方法:在构造Adapter时,使用缓存的convertView。

4、集合容器中的内存泄露

我们通常把一些对象的引用加入到了集合容器(比如ArrayList)中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了。

解决方法:在退出程序之前,将集合里的东西clear,然后置为null,再退出程序。

5、WebView造成的泄露

当我们不要使用WebView对象时,应该调用它的destory()函数来销毁它,并释放其占用的内存,否则其长期占用的内存也不能被回收,从而造成内存泄露。

解决方法:为WebView另外开启一个进程,通过AIDL与主线程进行通信,WebView所在的进程可以根据业务的需要选择合适的时机进行销毁,从而达到内存的完整释放。

小结

1 HashMap 是内存低效的,因为每一个mapping都需要单独的entry

每个元素多占用8byte内存(多了next和hash两个成员变量)。AutoBox【int转Integer,导致产生另一个对象】也会额外加4byte。Entry对象本身至少16byte。 不必要的时候尽量少用该容器

2 尽量避免使用Enum。

枚举相对于静态常量来说,需要两倍甚至更多的内存

3 尽量不要因一两个特性而使用大体积类库。

4  对于常量,请尽量使用static final。

5 对象不用时最好显式置为Null.

6 频繁修改时使用 StringBuffer(Thread-Safe)或 StringBuilder(Thread-Unsafe)。

使用String修改字符串时,若修改后字符串在字符串常量区不存在,便会新生成一个String对象。

你可能感兴趣的:(android 内存优化)