内存泄漏
由于代码瑕疵,导致某一内存虽然停止不用了,但是依然被其他东西引用着,使得GC 没有办法对他进行回收。
1、内存泄漏导致剩余可用的Heapy越来越少,会频繁触发GC
2、严重的会导致OOM
3、activity容易泄漏,可用Application的Context 而不是Activity的Context
4、注意Cursor对象是否及时关闭
优化方法
数据结构优化
1、频繁字符串拼接,将用“+”的方式更换为为 StringBuilder方式进行拼接
String是Java中基础且重要的类,并且String也是Immutable类的典型实现,被声明为final class,除了hash这个属性其它属性都声明为final,因为它的不可变性,所以例如拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所影响。
StringBuffer就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类,提供append和add方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列,把所有修改数据的方法都加上了synchronized。但是保证了线程安全是需要性能的代价的。
在很多情况下我们的字符串拼接操作不需要线程安全,这时候StringBuilder登场了,StringBuilder是JDK1.5发布的,它和StringBuffer本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。
StringBuffer 和 StringBuilder 二者都继承了 AbstractStringBuilder ,底层都是利用可修改的char数组(JDK 9 以后是 byte数组)。
所以如果我们有大量的字符串拼接,如果能预知大小的话最好在new StringBuffer 或者StringBuilder 的时候设置好capacity,避免多次扩容的开销。扩容要抛弃原有数组,还要进行数组拷贝创建新的数组。
我们平日开发通常情况下少量的字符串拼接其实没太必要担心
2、ArrayMap 、SparseArray 替换 HashMap
3、内存抖动(内存占用忽高忽低)
由于变量使用不当会造成内存抖动,会影响app运行的流畅性,局部变量的使用要注意一下就可以了。for循环内的变量定义在外面。
4、HashMap一个entry占用 32b
5、对象复用
复用系统自带的资源
6、ListView/GridView 更换为Recyclerview
7、避免在onDraw 方法内执行对象的创建,可以在构造函数里初始化
网友评论