AndroidStudio 内存泄漏分析 Memory Monitor
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的更多相关文章
- 使用Eclipse Memory Analyzer进行内存泄漏分析
一.准备工作 1)工具下载: http://www.eclipse.org/mat/downloads.php 可以选择eclipse插件的方式安装 http://download.eclipse.o ...
- 使用Eclipse Memory Analyzer进行内存泄漏分析三部曲
源地址:http://seanhe.iteye.com/blog/898277 一.准备工作 分析较大的dump文件(根据我自己的经验2G以上的dump文件就需要使用以下介绍的方法,不然mat会出现 ...
- Android内存泄漏分析及调试
尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/13017999 此文承接我的另一篇文章:Android进程的内存管理分析 首先 ...
- Android 内存泄漏分析与解决方法
在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...
- Java内存泄漏分析系列之五:常见的Thread Dump日志案例分析
原文地址:http://www.javatang.com 症状及解决方案 下面列出几种常见的症状即对应的解决方案: CPU占用率很高,响应很慢 按照<Java内存泄漏分析系列之一:使用jstac ...
- Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析
原文地址:http://www.javatang.com 一个典型的thread dump文件主要由一下几个部分组成: 上图将JVM上的线程堆栈信息和线程信息做了详细的拆解. 第一部分:Full th ...
- Javascript的内存泄漏分析
作为程序员(更高大尚的称谓:研软件研发)的我们,无论是用Javascript,还是.net, java语言,肯定都遇到过内存泄漏的问题.只不过他们都有GC机制来帮助程序员完成内存回收的事情,如果你是C ...
- OutOfMemoryError异常java内存泄漏(Memory Leak)和内存溢出(Memory Overflow)
本篇文章理解源自于<深入理解java虚拟机>2.4章节 实战:OutOfMemoryError异常 在以下例子中,所有代码都可以抛出OutOfMemoryError异常,但是要区分到底 ...
- (转)Android内存泄漏分析及调试
http://blog.csdn.net/gemmem/article/details/13017999 此文承接我的另一篇文章:Android进程的内存管理分析 首先了解一下dalvik的Ga ...
随机推荐
- Snort企业部署实战
Snort企业部署实战 1 背景 我们知道企业网络目前威胁来自两个位置:一个是内部,一个是外部.来自外部的威胁都能被防火墙所阻止,但内部攻击都不好防范.因为公司内部人员对系统了解很深且有合 ...
- 玲珑学院 1010 - Alarm
1010 - Alarm Time Limit:1s Memory Limit:128MByte DESCRIPTION Given a number sequence [3,7,22,45,116, ...
- Copying GC (Part two :Multi Space Copying GC)
目录 近似深度优先搜索方法 Cheney的GC复制算法 前提 执行结果 多空间复制算法 multi_space_copying()函数 mark_or_copy() copy() 执行过程 优缺点 近 ...
- AI:OPENCV实现人脸的自动识别
依赖jar包: faceRecognition.java package opencv; import java.awt.Graphics; import java.awt.image.Buffere ...
- 什么是PV和UV?
技术角度 1个PV是指从浏览器发出一个对网络server的Request,网络server接到Request之后.会開始把该Request相应的一个Page(Page就是一个网页)发送到client的 ...
- 指尖上的电商---(10)SolrAdmin中加入多核
在Solr中有的时候,我们并不仅仅是须要一种形式的索引文件.可能须要多种不同数据的索引文件.这时我们就能够在同一个Solr以下创建 多核. 比方,我们在solr以下想把产品信息和分类信息各存放一个索引 ...
- 自建的IPV6管道
前阵子琢磨IPV6,建立了一个给本机分配IPV6地址的管道,不怎么稳定 http://6tu.me
- 65.Express---express-session
转自:https://blog.csdn.net/zhangweiwtmdbf/article/details/50723816 第一部分 session概述 1.1 session 是什么? Ses ...
- 转 SQL集合函数中利用case when then 技巧
SQL集合函数中利用case when then 技巧 我们都知道SQL中适用case when then来转化数据库中的信息 比如 select (case sex when 0 then '男' ...
- noi2019模拟测试赛(四十七)
noi2019模拟测试赛(四十七) T1与运算(and) 题意: 给你一个序列\(a_i\),定义\(f_i=a_1\&a_2\&\cdots\&a_i\),求这个序列的所 ...