内存泄露介绍
定义:内存中存在已经没有用的对象
表现:内存抖动、可用内存逐渐变少
危害:内存不足、GC频繁、OOM
Memory Analyzer
先保存heap文件
然后转换:hprof-conv 源文件路径 转换后文件路径
内存泄露解决实战
代码:
public interface CallBack {
void dpOperate();
}
public class CallBackManager {
public static ArrayList<CallBack> sCallBacks = new ArrayList<>();
public static void addCallBack(CallBack callBack) {
sCallBacks.add(callBack);
}
public static void removeCallBack(CallBack callBack) {
sCallBacks.remove(callBack);
}
}
public class MemoryLeakActivity extends AppCompatActivity implements CallBack{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memoryleak);
ImageView imageView = findViewById(R.id.iv_memoryleak);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.splash);
imageView.setImageBitmap(bitmap);
CallBackManager.addCallBack(this);
}
@Override
public void dpOperate() {
// do sth
}
}
进入MemoryLeakActivity后回退,多操作几次,现象:
分析:
Memory Profiler查看:
MAT查看:
先从as中保存hprof文件
由于MAT不能识别从as中直接保存的hprof文件,需要转换:platform-tools/hprof-conv 源文件路径 转换后文件路径
搜索MemoryLeakActivity
列出MemoryLeakActivity实例,以及哪些对象引用了MemoryLeakActivity实例
查看MemoryLeakActivity对象到GC Roots的路径
查看最终泄露的原因