ok、写一段内存泄漏的code

 private TextView txt;

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memory_analyze);
txt = (TextView) findViewById(R.id.txt);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
txt.setText("Done");
}
}, 800000L);
}

注意这个匿名的Runnable被送到了Handler中,而且延迟非常的长。现在我们运行这个Activity,反复旋转屏幕。 
为什么会内存泄漏、阅读过上篇文章(Android AndroidStudio MAT LeakCanary 内存分析之 初识内存泄漏)的道友已经明白了。在翻转屏幕的时候Activity 就 Destroy了、但是runnable中的TextView还持有着Activity的引用,那么导致Activity不能被GC、导致内存泄漏

在执行这些操作时先打开 Android Monitor 并定位到Memory部分 

在Memory一栏中,可以观察不同时间App内存的动态使用情况,点击可以手动触发GC,点击可以进入HPROF Viewer界面,查看Java的Heap 再点击Analyzer Task,Android Monitor就可以为我们自动分析泄漏的Activity啦。执行完这些操作、as会自动打开*.hprof文件、这些文件可以用map打开、我们直接通过as来分析吧

(通过Dump Javaheap 和allocation tracking获取的文件都在 Camptures)如下 

在我们分析之前、先看看各部分所代表的含义 

Reference Tree代表指向该实例的引用,可以从这里面查看内存泄漏的原因,Shallow Size指的是该对象本身占用内存的大小,Retained Size代表该对象被释放后,垃圾回收器能回收的内存总和。

ok、点击红色箭头部分 Analyzer Tasks、打开后再点击绿色箭头进行分析

LeakedActivity 就是出现内存泄漏的activity 可以看到就是之前我们写的MemoryAna….


在instance中 我们可以右键 jump to Source跳到对应code中

找到元凶了、我们把他解决了吧

使用弱引用 + static Runnable 
现在我们把刚刚内存泄露的罪魁祸首 - TextView改成弱引用。 
最后onDestroy来手动控制生命周期

public class MemoryAnalyzeRightActivity extends Activity {
private TextView txt;
private Handler mHandler = new Handler(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memory_analyze);
txt = (TextView) findViewById(R.id.txt); Handler handler = new Handler(); handler.postDelayed(new DoneRunnable(txt), 800000L);
} private static final class DoneRunnable implements Runnable {
private final WeakReference<TextView> txtWeak; private DoneRunnable(TextView txtWark) {
this.txtWeak = new WeakReference<>(txtWark);
} @Override
public void run() {
final TextView textView = txtWeak.get();
if (textView!=null){
textView.setText("Done");
}
}
} @Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacksAndMessages(null);
}
}

AndroidStudio 内存泄漏分析 Memory Monitor的更多相关文章

  1. 使用Eclipse Memory Analyzer进行内存泄漏分析

    一.准备工作 1)工具下载: http://www.eclipse.org/mat/downloads.php 可以选择eclipse插件的方式安装 http://download.eclipse.o ...

  2. 使用Eclipse Memory Analyzer进行内存泄漏分析三部曲

    源地址:http://seanhe.iteye.com/blog/898277 一.准备工作  分析较大的dump文件(根据我自己的经验2G以上的dump文件就需要使用以下介绍的方法,不然mat会出现 ...

  3. Android内存泄漏分析及调试

    尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/13017999 此文承接我的另一篇文章:Android进程的内存管理分析 首先 ...

  4. Android 内存泄漏分析与解决方法

    在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...

  5. Java内存泄漏分析系列之五:常见的Thread Dump日志案例分析

    原文地址:http://www.javatang.com 症状及解决方案 下面列出几种常见的症状即对应的解决方案: CPU占用率很高,响应很慢 按照<Java内存泄漏分析系列之一:使用jstac ...

  6. Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析

    原文地址:http://www.javatang.com 一个典型的thread dump文件主要由一下几个部分组成: 上图将JVM上的线程堆栈信息和线程信息做了详细的拆解. 第一部分:Full th ...

  7. Javascript的内存泄漏分析

    作为程序员(更高大尚的称谓:研软件研发)的我们,无论是用Javascript,还是.net, java语言,肯定都遇到过内存泄漏的问题.只不过他们都有GC机制来帮助程序员完成内存回收的事情,如果你是C ...

  8. OutOfMemoryError异常java内存泄漏(Memory Leak)和内存溢出(Memory Overflow)

    本篇文章理解源自于<深入理解java虚拟机>2.4章节 实战:OutOfMemoryError异常   在以下例子中,所有代码都可以抛出OutOfMemoryError异常,但是要区分到底 ...

  9. (转)Android内存泄漏分析及调试

      http://blog.csdn.net/gemmem/article/details/13017999 此文承接我的另一篇文章:Android进程的内存管理分析  首先了解一下dalvik的Ga ...

随机推荐

  1. OpenCV中数据转换

    在OpenCV中Mat.CvMat和IplImage类型都可以代表和显示图像.IplImage由CvMat派生,而CvMat由CvArr派生即CvArr -> CvMat -> IplIm ...

  2. Convolution & Pooling exercise

    convolution First, we want to compute σ(Wx(r,c) + b) for all valid (r,c) (valid meaning that the ent ...

  3. Java经典算法案例

    笔试中的编程题3 JAVA经典算法40例[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? ...

  4. 《TensorFlow学习指南深度学习系统构建详解》英文PDF+源代码+部分中文PDF

    主要介绍如何使用 TensorFlow 框架进行深度学习系统的构建.涉及卷积神经网络.循环神经网络等核心的技术,并介绍了用于图像数据和文本序列数据的模型.给出了分布式深度学习系统在TensorFlow ...

  5. 最近遇到的若干Web前端问题:disable和readonly,JqueryEasyUI,KindEditor

    最近项目中用到了Jquery Easyui和KindEditor等框架组件,问题真不少啊~  一些看起来很简单理所当然的事情,竟然花费了不少时间,才解决好~  1.readonly和disable的区 ...

  6. C#获得文件夹下文件名

    String path = @"X:\xxx\xxx"; //第一种方法 var files = Directory.GetFiles(path, "*.txt" ...

  7. windows 常见环境变量(%AppData%、%TEMP%、%TMP%)

    set 命令查看全部环境变量: %AppData%(应用程序数据).%TEMP%(临时文件夹).%TMP%(临时文件夹) .%LocalAppData%(应用程序本地数据)三个环境变量: C:\Use ...

  8. 64。node.js 中间件express-session使用详解

    转自:http://jinjiakarl.com/2018/06/09/node-js-%E4%B8%AD%E9%97%B4%E4%BB%B6express-session%E4%BD%BF%E7%9 ...

  9. POJ 2437 贪心+priority_queue

    题意: 思路: 贪心 能不覆盖的就不盖 写得很乱 左闭右开的 temp //By SiriusRen #include <queue> #include <cstdio> #i ...

  10. PS:切图

    1.从psd中获取资源 2.基本了解 3.简单的图片操作和调整 4.对自己的审美提高一.界面设置: 1.新建设置:ctr+n; 预设:Web,大小Web(1920*1080) 背景:透明 2.移动工具 ...