内存泄漏

1.利用profile检查内存泄漏

内存泄漏_第1张图片
  如上图所示,内存分析器的默认视图包括以下内容:
    1 强制执行垃圾收集事件的按钮。
    2 捕获堆转储的按钮。
    3 记录内存分配的按钮。
  通过2(堆转储)以及1(垃圾回收)可检查有无内存泄漏
内存泄漏_第2张图片
  可以看出FirstActivity存在内存泄漏

2.mat分析

2.1 将profile堆转储文件导出

内存泄漏_第3张图片

2.2 转换格式:

  如导出文件为2019-8-3.hprof;
  将 export 导出的 hprof 文件转换为 Mat 的 hprof 文件。cd进入到 Android sdk/platform-tools/hprof-conv.exe

	hprof-conv -z D:\2019-8-3.hprof D:\2019-8-3-temp.hprof

2.3 下载mat工具

https://www.eclipse.org/mat/downloads.php

2.4 打开hprof文件

  打开MemoryAnalyzer.exe ;File -->Open Heap Dump

2.5 查看Histogram

  根据profile可知FirstActivity存在内存泄漏;搜索:
内存泄漏_第4张图片
内存泄漏_第5张图片
内存泄漏_第6张图片
  可知这个类存在内存泄漏,查看源码发现:
内存泄漏_第7张图片
内存泄漏_第8张图片
  Instanse持有 FirstActivity的引用,当 FirstActivity需要关闭的时候需要回收的时候,发现 Instanse还持有没有用的 FirstActivity引用,导致 Activity 无法被 GC 回收,造成内存泄漏。
  修改:
内存泄漏_第9张图片
  运行无内存泄漏。

你可能感兴趣的:(安卓)