Android内存泄漏终极解决篇(上)

2019-12-10 19:22:04王旭
这篇文章主要为大家介绍了Android内存泄漏的相关资料,重点介绍了内存泄漏的检查工具Heap和内存泄漏的分析工具MAT,感兴趣的小伙伴们可以参考一下  

一、概述
在Android的开发中,经常听到“内存泄漏”这个词。“内存泄漏”就是一个对象已经不需要再使用了,但是因为其它的对象持有该对象的引用,导致它的内存不能被回收。“内存泄漏”的慢慢积累,最终会导致OOM的发生,千里之堤,毁于蚁穴。所以在写代码的过程中,应该要注意规避会导致“内存泄漏”的代码写法,提高软件的健壮性。 
本文将从发现问题、解决问题、总结问题的三个角度出发,循序渐进,彻底解决“内存泄漏”的问题。

二、内存泄漏的检查工具Heap

工欲善其事必先利其器,要检测“内存泄漏”的发生,需要借助DDMS中的Heap工具及MAT工具,Heap工具用于大致分析是否存在“内存泄漏”,而MAT工具则用于分析“内存泄漏”发生在哪里。

Heap工具的使用介绍

Android内存泄漏终极解决篇(上)

具体操作 

  • 1.在Devices设备列表中,找到你所在的设备,点击你想要监控的进程。
  • 2.点击“Update Heap”按钮更新堆内存的情况。
  • 3.点击“Heap”视图,查看内存的情况。
  • 4.每次在Activity的退出和进入的时候点击“Cause GC”,手动调用GC释放应用的内存。
  • 5.观察data oject那一行,每一次点击“Casue GC”的时候,观察Total Size的值,如果该值不断增加,则说明该应用程序存在“内存泄漏”。

    我们先模拟一下内存泄漏,然后通过Heap工具来判断一下是否存在内存泄漏。 
    上一段存在内存泄漏的代码:

    public class LeakAty extends Activity {
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.aty_leak);
      testLeak();
    
     }
    
     /**
      * 测试内存泄漏的代码
      */
     private void testLeak() {
      new Thread(new Runnable() {
    
       @Override
       public void run() {
        while (true) {
         try {
          Thread.sleep(1000);
         } catch (InterruptedException e) {
          e.printStackTrace();
         }
        }
       }
      }).start();
     }