用新版的AS 的profiler 查看内存泄漏

记录一下使用Android Studio 的profiler 查看内存泄漏的过程。新版的AS 的profiler 功`能强大。我们可以很方便的查看到一个界面里的内存泄漏。

首先我们来看看不发生内存泄漏时候的情况:


public class MemoryLeakActivity extends AppCompatActivity {private ValueAnimator count20sToStop;// 这里有在onDestory里处理,这样做肯定会避免掉当前情况下handler的内存泄露@Overrideprotected void onDestroy() {super.onDestroy();mHandle.removeMessages(FLAG);}private static int FLAG = 999;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_memory_leak);Button btn = findViewById(R.id.btn);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {finish();}});mHandle.sendEmptyMessageDelayed(FLAG, 1000);}private Handler mHandle = new Handler(Looper.myLooper()) {@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);mHandle.sendEmptyMessageDelayed(FLAG, 1000);}};
}


确实没有泄露的地方。

然后我们制造一个内存泄漏的Activity。 把onDestory去掉。肯定会发生内存泄漏的。

public class MemoryLeakActivity extends AppCompatActivity {private static int FLAG = 999;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_memory_leak);Button btn = findViewById(R.id.btn);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {finish();}});mHandle.sendEmptyMessageDelayed(FLAG, 1000);}private Handler mHandle = new Handler(Looper.myLooper()) {@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);mHandle.sendEmptyMessageDelayed(FLAG, 1000);}};}

然后点开AS 的profiler

然后我们可以查看到我们应用运行时候的cpu 内存等数据的情况。这里我们只要关注内存即可。

接下来我们从启动页面跳转到有内存泄漏的那个Activity。


这里可以看到我们从LunchActivity 跳转到了MemoryLeakActivity。

接下来我们点击button finish()掉 MemoryLeakActivity。回到我们原来的起动页面。这时候点垃圾桶,触发几次gc。

这些小垃圾桶就代表我们触发的gc.

然后选取record 来记录我们产生的内存泄漏。


新版的AS的Record 点一下就可以为我们自动记录一段内存快照。然后直接弹出我们的内存数据。不用像以前一样你需要拉一段距离。

这里很清晰的给我们指出有2出内存泄漏。

点一下这个 2 Leaks 就会直接显示出内存泄漏的类的包名位置(非常人性化)。


这里我们看到内存泄漏的位置一个是我们自己的Activity里Handler 造成的内侧泄漏。一处是系统里ReportFragment发生的内侧泄漏。 这个估计也跟Handler 有关。

然后我们点到相关的类还可以进一步查看内存泄漏的类的引用关系

使用MemoryAnalyzer

我们也可以导出内存快照。使用mat来进行内存分析。

首先使用 hprof-conv.exe 来转换一下我们导出的内存快照。记得把platform-tools 配置到环境变量里你才能找到hprof-conv 这个命令。

 hprof-conv -z 1.hprof 1-mat.hprof

生成一个新文件

打开Mat 导入 1-mat.hprof : file->Open Dump Heap 。 点击finish



这里 Shallow Size是对象本身占据的内存的大小,不包含其引用的对象。对于常规对象(非数组)的Shallow Size由其成员变量的数量和类型来定,而数组的ShallowSize由数组类型和数组长度来决定,它为数组元素大小的总和。

Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C,C就是间接引用) ,并且排除被GC Roots直接或者间接引用的对象。

我们进一步操作排除软引用,弱引用,虚引用看看剩下哪些东西。


然后我们就可以看到排除完软引用,弱引用,虚引用后内存里剩下的对象。根据剩余的对象来分析内存泄漏。

整体来看Mat 不如新版AS的profiler好用。新版AS的profiler基本上算是傻瓜式的使用了。只要目前看在安卓开发中只要会用新版AS 的profiler 即可。

使用Android Studio 查看内存泄漏相关推荐

  1. 基于Android Studio的内存泄漏检测与解决全攻略

    自从Google在2013年发布了Android Studio后,Android Studio凭借着自己良好的内存优化,酷炫的UI主题,强大的自动补全提示以及Gradle的编译支持正逐步取代Eclip ...

  2. 使用 Android Studio 检测内存泄漏与解决内存泄漏问题

    本文在腾讯技术推文上 修改 发布. http://wetest.qq.com/lab/view/63.html?from=ads_test2_qqtips&sessionUserType=BF ...

  3. android studio 解决内存泄漏

    自从Google在2013年发布了Android Studio后,Android Studio凭借着自己良好的内存优化,酷炫的UI主题,强大的自动补全提示以及Gradle的编译支持正逐步取代Eclip ...

  4. 使用android studio查看内存,Android Studio Profiler使用心得 检测内存泄露问题

    最近在分析app的内存泄露问题研究了下as的profiler功能  这里记录下个人心得 下面是个人心得 1.首先得出结论profiler不详细提供分析c或c++库进行的内存占用 其中包括android ...

  5. 关于Android应用程序内存泄漏 你需要知道的一切

    关于Android应用程序内存泄漏 你需要知道的一切 原文:https://blog.aritraroy.in/everything-you-need-to-know-about-memory-lea ...

  6. Android常见的内存泄漏分析

    内存泄漏原因 当应用不需要在使用某个对象时候,忘记释放为其分配的内存,导致该对象仍然保持被引用状态(当对象拥有强引用,GC无法回收),从而导致内存泄漏. 常见的内存泄漏源头 泄漏的源头有很多,有开源的 ...

  7. Android中的内存泄漏

    ** Android中的内存泄漏 ** Android中的内存泄漏: 概念:程序在申请内存后,当该内存不需再使用但却无法被释放 & 归还给程序的现象,对应用程序的影响,容易使得应用程序发生内存 ...

  8. android studio查看字节码,使用Android studio查看Kotlin的字节码教程

    Kotlin是一门JVM语言,它被google大力推广,现如今已经是Android官方推荐的开发语言了.为了更好的学习Kotlin,你必须要从字节码的角度来看待语法特点,这样可以更好的加深自己的理解. ...

  9. android studio查看jar包源码,Android Studio查看源代码报错

    我们经常用Android Studio 查看Android的源代码,今天我们就来学习查看源代码的正确姿势. Android Studio查看源代码 我们用Android Studio查看源代码会遇到下 ...

最新文章

  1. 可逼近信道容量编码技术之霍夫曼编码的实现
  2. AI化身监工,上班还能摸鱼吗?
  3. java gui 读取文件夹_java Swing GUI 入门-文件读写器
  4. rest接口自动化测试_REST服务的自动化测试
  5. openshift k8s_带有DIY的Openshift上的Spring Boot / Java 8 / Tomcat 8
  6. 命令不识别_互助问答138期:GMM命令代码中如何识别年份国家及异方差检验问题...
  7. 动图:程序员才懂的这些!
  8. html div英文自动换行,div 实现长英文字母自动换行CSS
  9. php查看php进程
  10. 【收藏】DIABLO 2 CD KEY
  11. cf1668E. Half Queen Cover 思维
  12. 完美世界-游戏Java开发工程师-一面
  13. Quantile g-computation的介绍及R实现
  14. 中山大学计算机软件专业,【广州日报】中山大学在珠海校区新成立人工智能学院和软件工程学院...
  15. 微信小程序 - 解决 rich-text 富文本解析图片无法自适应宽高问题(图片超出屏幕宽度且不受控)
  16. 离线数据系统之MapReduce加强
  17. micro python 语音识别_语音识别
  18. E.A. Guillemin 吉耶曼统一古典电路理论的人
  19. Ubuntu的快乐学习2——SnowBoy语音唤醒
  20. bl小说里面有个机器人管家_《机器管家》简介

热门文章

  1. [转]这些道理不懂,你注定就是穷打工的命
  2. 给raspberry Pi B 安装3.5英寸触摸屏
  3. 【Java】实现多线程计算阶乘(完整版)
  4. 2020-11-21 芯片测试golang实现
  5. Sketch快捷键大全 Sketch如何自定义快捷键?
  6. win10无限重启_win10系统重置教程
  7. 电子书如何通过邮箱传入kindle
  8. sketch八款设计插件,画图效率翻倍
  9. 教你操作视频横屏改竖屏的方法
  10. 快速查询多个圆通快递未签收单号的走件信息