内存泄漏:该回收的无法回收
内存抖动:频繁的执行GC。
CMS垃圾收集器
GC->垃圾收集器(GC具体的实现就是垃圾收集器)
STW stop the word:当GC垃圾回收的时候,所有的工作线程挂起。
带来的问题:
1、会造成页面的卡顿。为什么会卡顿,说到底还是因为GC带来的卡顿。
2、OOM 内存泄漏是内存使用量一直增加,内存抖动是增加降低。
为什么内存抖动造成OOM?
垃圾回收算法:三种。三种算法当中主要是标记清除算法。如果GC采用标记清除算法会长生OOM。(内存碎片)
CMS就是采用标记清除算法。
内存泄漏: Leakcanary 快手 KOOM 微信Matrix
内存抖动:抖音Kenzo(并没有开源),通过AS中的profile也可以测试
案例一、
onMesuger 方法一次
onDraw多次,所以该方法里面不要创建对象,要减少对象的创建。
8.0之后垃圾回收器好很多,原因8.0后是CC垃圾收集器
案例二、
当循环大量创建对象的时候,可以考虑对象池的使用。
借鉴:
Handler 对象池:Message 单链表,不需要筛选,handler.obtainMessage()
Glide对象池:map,需要筛选,对象有差异
key:长度,为什么长度作为key,方便筛选
value:byte[]
案例三、
Gson 与对象池结合使用,给Gson设置Adapter,javaBean然后就可以在Adapter中自己创建,结合对象池防止不断重复创建对象