Android Studio没有提供直接的Native层的内存泄露检测工具,但我们仍可以通过开源工具进行动态检测和静态检测

动态检测

在APP运行时进行检测,就像LeakCanary

Update: LeakTracer只能在简单的场景下检测Native层代码;复杂项目,比如依赖多个native module, 或者依赖其他module的native代码,或者依赖的不是Native代码而是so库,就容易出现漏报误报的情况。所以目前还没发鲁棒性较强的动态检测内存泄露的工具,欢迎推荐~

使用方法:

1.调用leaktracer::MemoryTrace::GetInstance().startMonitoringAllThreads();表示开始检测;

2.调用

leaktracer::MemoryTrace::GetInstance().writeLeaks(out);表示结束检测。

记得给予APP文件读写权限,不然会write失败。

3.将文件拿到手:

adb pull /sdcard/leaktracer.log

leaktracer.log文件包含泄露时间(time以秒为单位)、调用堆栈的地址信息、内存泄漏的大小等:

# LeakTracer report diff_utc_mono=1496511718.682943

leak, time=135120.534718, stack=0x36fd6 0x35a90 0x359a4 0x32fea 0xc952d3d0, size=1, data=.....

使用

leak-analyze-addr2line脚本批量定位

或者

按Android JNI Crash定位步骤的步骤定位泄露的具体位置

其中libleaktracer部分的泄露提示是可以忽略的,只需要关注项目自身部分。

注意: 一定要用未strip的so文件,不然堆栈信息会是问号

使用tip:

开始检测前请先杀掉APP进程, 然后重启APP, 不然连续检测时, 后面的检测结果会不准.

Android原生开发--用Valgrind排查内存问题

文章里的工具我在两台root的小米设备上都没有弄成功;

另一个Valdroid项目我在一台root的小米设备上运行成功了,但是却没有打印日志。大概是因为这个项目是14年的,目前的手机很多配置和之前不一样了,所以不再适用。

感觉即使工具运行成功了,最后能不能有效检测出问题也不确定,所以先暂时放一边。毕竟实践的人少,而且谷歌也已经弃用不推荐了,肯定坑也多。

CheckJNI

11年就出品的工具,网上有一些资料,接入也不算麻烦。但一直没火起来还是有原因的:

我写了几号数组越界的代码,要么直接Crash,要么没检测出来,接了和没接一样,摊手.jpg

静态检测

有人推荐cppcheck

安装使用倒挺简单的, 但我故意写了内存泄露的代码

short* buffer = new short[8];

然后又试了一下valgrind

仍然没效果。

也可能是cppcheck和valgrind能检测出部分的代码错误,但不保证所有错误都检测出来,那检测一下也没坏处。

android native堆内存泄露,Android Native内存泄露检测相关推荐

  1. android堆内存解析,heapsnap HeapSnap 是一款针对 Android 进程堆内存进行追踪、定位,以便查出泄露位置的工具 @codeKK c开源站...

    1.HeapSnap 是什么 HeapSnap 是一个定位内存泄露的工具,适用于 Android 平台. 主要特性如下: 对系统负载低 不需要修改目标进程的源代码 支持 Andoroid 上的大多数 ...

  2. android 进程间的通信,Android native进程间通信实例-binder结合共享内存

    在android源码的驱动目录下,一般会有共享内存的相关实现源码,目录是:kerneldriversstagingandroidashmem.c.但是本篇文章不是讲解android共享内存的功能实现原 ...

  3. Android开发笔记——常见BUG类型之内存泄露与线程安全

    一.内存泄露 1.很抱歉,"XXX"已停止运行.OOM? 怎样才能让app报OOM呢?最简单的办法如下: Bitmap bt1 = BitmapFactory.decodeReso ...

  4. android中内存泄露,Android中的内存泄露

    编辑推荐: 本文来自于csdn,本文主要从java的内存模型讲起,最终举出几个内存泄露的例子和解决方案. java运行时内存模型 具体信息:http://gityuan.com/2016/01/09/ ...

  5. android定时器内存泄露,Android内存泄漏分析以及解决方案

    本文是看了公众号的文章,非常感谢,链接如下 概念 1.什么是内存泄漏? 一句话总结的话,那就是生命周期长的对象持有短生命周期的对象的引用导致其无法被及时释放,就会造成内存泄漏.(内存泄漏最终会导致内存 ...

  6. android获取当前应用占用的内存大小,Android分析已安装应用占用内存

    问题 Android开发时可以通过AndroidStudio提供的一些系列工具查看应用的内存占用,十分的方便. 但是如果是对一个成品的已安装App快速查看内存占用呢,下面简单讲两种方式. 方案一:to ...

  7. 【Android高级】查看手机及应用内存状况的方法

    我 们知道,android程序内存一般限制在16M,当然也有24M的,而android程序内存被分为2部分:native和dalvik,dalvik 就是我们平常说的java堆,我们创建的对象是在这里 ...

  8. android app性能优化大汇总(内存性能优化)

    内存简介: RAM(random access memory)随机存取存储器.说白了就是内存. 一般Java在内存分配时会涉及到以下区域: 寄存器(Registers):速度最快的存储场所,因为寄存器 ...

  9. 【Android 内存优化】Java 内存模型 ( Java 虚拟机内存模型 | 线程私有区 | 共享数据区 | 内存回收算法 | 引用计数 | 可达性分析 )

    文章目录 一. Java 虚拟机内存模型 二. 程序计数器 ( 线程私有区 ) 三. 虚拟机栈 ( 线程私有区 ) 四. 本地方法栈 ( 线程私有区 ) 五. 方法区 ( 共享数据区 ) 1. 方法区 ...

最新文章

  1. R语言基于DALEX包进行特征筛选(feature selection)
  2. nvm 下载node 下载不下来_一键下载网页所有图片,把美丽存下来
  3. IIS服务器五大安全要素
  4. python的jupyter的使用教程-强大的jupyter,python开发者的福音
  5. 93. Restore IP Addresses 复原IP地址
  6. EHCache 初步使用指南
  7. 通过SSL发送的Java邮件
  8. 支付宝辟谣交易 5 万受监控;App Store 宕机;谷歌抛弃 AI | 极客头条
  9. P1262 间谍网络
  10. CAPL学习之路-以太网函数
  11. 高德地图MapABC报错
  12. Python之列表和元组
  13. uniapp引用iconfont字体图标
  14. clock skew detected on
  15. 【C++】斐波那契凤尾
  16. c语言是流式,C语言中的文件又被称为流式文件。
  17. 离线安装OneNote for Windows 10
  18. 渥太华大学计算机科学COOP,加拿大渥太华大学热门专业【生物工程计算机科学】】申请要求...
  19. PHP数据类型与运算符
  20. 浏览器原理-v8引擎-js执行原理

热门文章

  1. import h5py ImportError: DLL load failed: the specified module could not be found
  2. matplotlib绘制带比例(percentile)的堆叠(stacked)条形图(bar plot)
  3. NGS的测序仪和相关技术时间轴 NGS相关数据库和项目时间轴
  4. BLAST数据库搜索
  5. 三代测序数据分析之文献推荐
  6. mysql源码安装都能装什么模块_源码安装后,添加其他模块
  7. linux进程间通讯-消息队列
  8. java exchange发邮件_java发送exchange邮件问题
  9. android canvas绘制圆角_Android自定义View撸一个渐变的温度指示器(TmepView)
  10. tensorflow创建张量