一、什么是内存泄漏?
注意:内存释放主要考虑new出来的这部分对象,这部分对象在堆里面,才会被GC回收。因此内存泄漏主要考虑new出来的对象不用了能不能及时回收掉。
二、出现内存泄漏的原因?
三、常见的内存泄漏有哪些?
1.Context被静态持有
calss Util{
private static Context context;
public static void utils(Context context){
this.context = context;
}
}
2.非静态内部类
class Activity{
r = new Runnable(){
run(){//耗时操作}
}
t = new Thread(){}
}
解决方法:
class Activity{
MyRunnable r = new MyRunnable()
void create()
private static class MyThread extends Thread {
}
private static class MyRunnable implements Runnable{
}
}
3.静态集合存储对象
Static Vector v = new Vector(10);
for (int i = 1; i<100; i++)
{
Object o = new Object();
v.add(o);
o = null;
}
4.资源未关闭 没有解除注册造成内存泄露
5.Handler引起的内存泄漏
四、Handler引起的内存泄漏分析
1.之前我们定义的Handler
// 接收消息,定义一个Handler对象,并实现handleMessage方法
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
// 在此接收子线程发送的消息
}
};
//发送消息
Message msg=new Message();
msg.obj=receiveData;
msg.what= MSG_RECEIVEDATA_SUCCEED;
handler.sendMessage(msg);
2.为什么现在这样定义会引起内存泄漏?
public class HandlerActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler);
//发送一条10分钟后的消息
handler.sendEmptyMessageDelayed(0, 10 * 60 * 1000);
//然后关闭Activity
finish();
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// ...
}
};
}
3.怎么解决内存泄漏?
即在内部类的构造方法中,创建一个对外部类的弱引用,然后再内部类的方法中通过弱引用获取外部类对象,进行非空判断后再进行操作,OK,修改一下我们的代码
public class HandlerActivity extends BaseActivity {
@Bind(R.id.tv_handler)
TextView tvHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler);
ButterKnife.bind(this);
new WeakHandler(this).sendEmptyMessageDelayed(0, 10 * 60 * 1000);
finish();
}
private static class WeakHandler extends Handler {
WeakReference<HandlerActivity> weakReference;
public WeakHandler(HandlerActivity activity) {
weakReference = new WeakReference<HandlerActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
HandlerActivity activity = weakReference.get();
if (activity != null && activity.tvHandler != null) {
activity.tvHandler.setText("收到Handler发送的消息");
}
}
}
}
4.最终目的
五、四种引用
六、内存泄漏分析工具
- 哪怕完全了解 内存泄露的原因,但难免还是会出现内存泄露的现象
- 下面将简单介绍几个主流的分析内存泄露的工具,分别是
MAT(Memory Analysis Tools)
Heap Viewer
Allocation Tracker
Android Studio 的 Memory Monitor
LeakCanary
6.1 MAT(Memory Analysis Tools)
- 定义:一个
Eclipse
的Java Heap
内存分析工具 ->>下载地址 - 作用:查看当前内存占用情况
- 具体使用:MAT使用攻略
6.2 Heap Viewer
- 定义:一个的
Java Heap
内存分析工具 - 作用:查看当前内存快照
- 具体使用:Heap Viewer使用攻略
6.3 Allocation Tracker
- 简介:一个内存追踪分析工具
- 作用:追踪内存分配信息,按顺序排列
- 具体使用:Allocation Tracker使用攻略
6.4 Memory Monitor
简介:一个
Android Studio
自带 的图形化检测内存工具作用:跟踪系统 / 应用的内存使用情况。
6.5 LeakCanary
- 简介:一个
square
出品的Android
开源库 ->>下载地址 - 作用:检测内存泄露
- 具体使用:www.liaohuqiu.net/cn/posts/le…