一、什么是内存泄漏
通俗讲就是该回收的对象,因为引用问题没有被回收,最终会产生OOM
二、产生的原因
一个长声明周期的对象持有一个短生命周期对象的引用
三、Java如何解决
Java不会解决,需要开发者通过profile或者mat工具进行分析
你可以模拟一段内存泄漏的代码,然后运行,并马上退出activity,这个时候打开profile工具,进入memory来分析内存情况,先强迫进行垃圾回收(如图),然后截取内存快照按照包来找一下LeakActivity
会发现有200多个字节没有被回收,代表已经发生内存泄漏
内存泄漏示例代码:
public class LeakActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.leak);
MyThread t = new MyThread(this);
t.start();
}
class MyThread extends Thread {
Context context;
MyThread(Context context) {
this.context = context;
}
@Override
public void run() {
try {
Thread.sleep(1000000);//1000s
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}