最近在做项目遇到应用占用内存过多问题,影响了其他应用运行,经过优化从原有占用内存100MB下降到30MB。
1、减少内存泄漏
措施一、内部类handler改为静态内部类handler,并使用弱引用,引用外部activity对象,代码如下
private static class MyHandler extends Handler{
WeakReference<ScanActivity> activity;
public MyHandler(ScanActivity activity){
this.activity = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//dosomething
}
}
private MyHandler handler = new MyHandler(this);
措施二:
内存泄漏主要原因是长生命周期对象引用了短生命周期对象,导致了短生命周期对象不能释放,外部单例对本activity的引用,也导致了本activity释放失败的问题。
2、activity 结束后jvm并没有立即释放内存
这个是android机制决定的,网上说法也一大把,大致意思也都是activity destory后,应用不会立即释放activity占用的内存,解决方法也众说纷纭,大致用了下面三种方法,都起到了作用,减少了activity 结束后内存占用
措施一:在activity destory中设置空linearlayout布局
LinearLayout linearLayout = new LinearLayout(this);
setContentView(linearLayout);
linearLayout = null;
措施二:
在activity destory中应用的view全部置空
textview = null;
linearlayout = null;
button = null;
措施三:
在activity destory最后主动调用gc
super.onDestroy();
System.gc();
System.runFinalization();