什么是内存泄漏?

在运行的程序中,如果一个无法访问的对象仍然占用着内存空间,即为此对象造成了内存泄漏

垃圾回收(GC)机制:

当垃圾回收运行时,虚拟机首先会识别GC Root。GC Root 是一个可以从堆外部访问的对象,它可以是本地变量或运行中的线程等。虚拟机会识别所有可以从GC Root访问的对象,它们将会被保留,而其他无法从GC Root访问的对象,则会被认为垃圾并回收掉。

一、通过Memory Profiler检测内存泄漏

打开 Memory Profiler,选中MEMORY ,进入MEMORY视图,
点击下图所示按钮,保存Heap Dump:

1.1、Activity 和 Fragment 内存泄漏检测

Heap Dump 加载完成后,勾选 “Activity/Fragment Leaks” 选框:
此时如果有检查到 Activity 或 Fragment 的泄漏,就会在界面中显示出来:

需要注意的是:
针对 Fragment 有个特别的情况: 如果您载入的 Heap Dump 的时机,刚好介于 Fragment 被创建和被使用的时间之间,就会造成 Memory Profiler 误报;相同情况也会发生在 Fragment 被缓存但是没有被复用的时候

1.2、通过包名筛选来查看APP内其他内存泄漏的地方


选择Arrange by package :选择对应包名,查看可能存在内存泄漏的地方
① :选择包名筛选
② :点击LeakTestActivity$1 查看LeakedActivity内存泄漏的地方
③ :右键,跳转到发生内存泄漏源码的地方

1.3、通过观察 MEMORY 内存图标趋势判断是否发生内存泄漏

可以通过横竖屏切换,或者多执行几次可能发生内存泄漏的代码,通过观察MEMORY 轨迹趋势,如果内存走向是增加的,则肯定发生了内存泄漏,如下图:

查看堆和内存分配:
https://developer.android.com/studio/profile/memory-profiler?utm_source=android-studio#capture-heap-dump

二、HeapView 使用

启动:Sdk/tools/monitor 启动Monitor。端口冲突的话可以先关闭AS

A:打开DDMS视图,
B:选择Heap窗口
C:选择对应包名,点击Heap 按钮
D:点击Heap按钮
E:Cause GC 更新数据

列名 意义
Heap Size 堆栈分配给App的内存大小
Allocated 已分配使用的内存大小
Free 空闲的内存大小
%Used Allocated/Heap Size,使用率
Objects 对象数量

内存详情

类型 意义
free 空闲的对象
data object 数据对象,类类型对象,最主要的观察对象
class object 类类型的引用对象
1-byte array(byte[],boolean[]) 一个字节的数组对象
non-Java object 非Java对象

每一列含义:

列名 意义
Count 数量
Total Size 总共占用的内存大小
Smallest 将对象占用内存的大小从小往大排,排在第一个的对象占用内存大小
Largest 将对象占用内存的大小从小往大排,排在最后一个的对象占用的内存大小
Median 将对象占用内存的大小从小往大排,拍在中间的对象占用的内存大小
Average 平均值

点击data object行时,可以看到如下的柱状图

横坐标是对象的内存大小,这些值随着不同对象是不同的,纵坐标是在某个内存大小上的对象的数量

2.1 HeapView使用场景:

Heap Viewer中的数值会自动在每次发生GC时会自动更新。

2.2 内存泄漏检查

在需要检测的用例执行后,手动点击 按钮,触发GC,然后观察 data object 一栏的 Total Size (也可以观察Heap Size/Allocated内存的情况) ,看看内存会不会恢复到一个稳定的值,多次操作后,只要这个值稳定,说明没有内存泄漏。

如果每次GC后值都在增长,则说明有内存泄漏的可能性

2.3 内存抖动检查

内存抖动会伴随着频繁的GC。只需要开启Heap View,观察数据就行了。
如果发生内存抖动,会发现数据在短时间内频繁更新

此部分参考:https://blog.csdn.net/zhangfei2018/article/details/49154479

三、LeakCanary检查内存泄漏

添加依赖:

debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5.4'
releaseImplementation'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4'

Application中初始化:

这样就能检测Activity的内存泄漏了,当然Fragment或者其他的内存泄漏是检测不到的。

如果需要检查Fragment内存泄漏,需要使用RefWatcher来监控,修改如下:

在Application中提供一个全局的RefWatcher 对象,然后在Fragment调用如下:

更多内存分析方式:

dump文件分析、MAT分析

崩溃检测

Monkey 检测ANR和Crash

Android内存检测工具相关推荐

  1. Android内存检测工具系列工具集

    Android内存检测工具系列工具集 Android关于内存的工具不少,灵活地选择工具就显得特别重要.在此特别推荐分享涵盖一定初步和定位能力的工具,可以让我们一步到位地分析问题,提升效率. 在此列举几 ...

  2. Android 内存检测工具

    所谓内存泄漏,是指本该被回收的内存由于某种原因绕开了GC回收算法,从而导致该内存无法被有效数据使用而使得总内存减小的情况. 内存泄漏会导致内存消耗的增加,大量的消耗会使得APP OOM,特别是在一些内 ...

  3. 内存检测工具Dr. Memory的使用

    Dr. Memory是一个内存调试工具,它是一个开源免费的内存检测工具,它能够及时发现内存相关的编程错误,比如未初始化访问.内存非法访问.数组越界读/写.以及内存泄露等.它可以在Linux.Windo ...

  4. 【调试】Linux下超强内存检测工具Valgrind

    [调试]Linux下超强内存检测工具Valgrind 内容简介 Valgrind是什么? Valgrind的使用 Valgrind详细教程 1. Valgrind是什么? Valgrind是一套Lin ...

  5. 动态内存检测工具Valgrind

    1. Valgrind查找内存泄露利器 Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析.你可以在它的环境中运行你的程序来 ...

  6. 台式机内存测试软件中文版,内存检测工具 MemTest

    MemTest是可靠的内存检测工具,通过对电脑进行储存与读取操作来分析检查内存情况.内存检测工具 MemTest不但可以彻底的检测出内存的稳定度,还可同时测试记忆的储存与检索资料的能力,让你可以确实掌 ...

  7. 如何查看计算机硬盘的软件内存条,内存检测工具,内存检测软件 - 内存条检测工具就用金山卫士 - 安全专题...

    在去电脑城去买内存条,不知道该内存条怎么样,怕自己遇到不法奸商.金山卫士已经集成 内存条检测工具,可以智能监测到该内存所有信息以及该内存性能怎么样. 内存检测工具 就用金山卫士 许多网民从电脑城购买回 ...

  8. ios代码中的内存泄露,内存检测工具leaks 检测不出来

    iphone开发过程中,代码中的内存泄露我们很容易用内存检测工具leaks 检测出来,并一一改之,但有些是因为ios 的缺陷和用法上的错误,leaks 检测工具并不能检测出来,你只会看到大量的内存被使 ...

  9. 内存测试内存检测工具

    测试内存,往往不局限于一种软件,因为每种工具都有自己的局限性.灵活运用多种工具,可以实现效益最大化 1.<HCI MemTest> https://hcidesign.com/memtes ...

最新文章

  1. 人工智能帮助预测混合用药的副作用
  2. 如何将CSDN文档输出PDF文件?
  3. 19-spring学习-springMVC环境配置
  4. 操作系统引发对未来道路的认知思考
  5. vs与git中间的阻拦--Git failed with a fatal error. error: open(“.vs/GBA/v16/Server/sqlite3/db.lock
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的高校大学生社团招新管理系统
  7. PHP实现上传文件并存进数据库的方法
  8. 利用http-server测试vue-cli打包后的项目
  9. 大数据和商业智能BI有什么关系
  10. 软件工程第二次作业——个人项目
  11. html中父子元素的解释,CSS 子绝父相 理解
  12. 使用VUE分分钟写一个验证码输入组件
  13. IOS逆向(5)Tweak代码编写
  14. 二极管与门,或门,三极管整合
  15. Android彩信发送
  16. 奇想大白话之《羊了个羊》为何火,技术很厉害吗?
  17. MySQL数据库——锁机制
  18. 为 什 么 说 Synchronized 是 非 公 平 锁
  19. 微擎 人人商城 对接京东vop 对接京东商品,同步商品 地址,库存,价格,上下架等。(一) 同步商品...
  20. 数学建模:整数规划示例模型 (Python 求解)

热门文章

  1. ubuntu 桌面环境出现异常常用的解决方法
  2. GLES2.0中文API-glShaderBinary
  3. windows系统下载合集
  4. 斯诺克台球游戏HTML5
  5. c语言macro pdf,C语言的宏macro的使用
  6. 简述适配器的概念、作用以及主机适配器的概念
  7. 没学懂汇编写了个CE·····
  8. Kafka的offset自定义存储实现
  9. 懒人福音,分享4个实用的Python自动化脚本
  10. USB Network Gate SDK Crack,构建USB Network Gate的技术