内存
下面我们来模拟一种Activity内存泄漏的场景,内部类相信大家都有用过,如果我们在一个类中又定义了一个非静态的内部类,那么这个内部类就会持有外部类的引用,如下所示:
- public class MainActivity extends ActionBarActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- LeakClass leakClass = new LeakClass();
- }
- class LeakClass {
- }
- ......
- }
目前来看,代码还是没有问题的,因为虽然LeakClass这个内部类持有MainActivity的引用,但是只要它的存活时间不会长于MainActivity,就不会阻止MainActivity被垃圾回收器回收。那么现在我们来将代码进行如下修改:
- public class MainActivity extends ActionBarActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- LeakClass leakClass = new LeakClass();
- leakClass.start();
- }
- class LeakClass extends Thread {
- @Override
- public void run() {
- while (true) {
- try {
- Thread.sleep(60 * 60 * 1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
- ......
- }
这下就有点不太一样了,我们让LeakClass继承自Thread,并且重写了run()方法,然后在MainActivity的onCreate()方法中去启动LeakClass这个线程。而LeakClass的run()方法中运行了一个死循环,也就是说这个线程永远都不会执行结束,那么LeakClass这个对象就一直不能得到释放,并且它持有的MainActivity也将无法得到释放,那么内存泄露就出现了。
现在我们可以将程序运行起来,然后不断地旋转手机让程序在横屏和竖屏之间切换,因为每切换一次Activity都会经历一个重新创建的过程,而前面创建的Activity又无法得到回收,那么长时间操作下我们的应用程序所占用的内存就会越来越高,最终出现OutOfMemoryError。
坚持,勤奋,量变出质变

浙公网安备 33010602011771号