android 常见的泄漏内存方法和 leakcanary 使用方法
虽然VM接管了内存分配和回收,但是人类在解决问题的同时也会重新创造出一些新的问题,所以问题永远都解决不了,就产生各种稀奇古怪的就业机会了(跑题跑不停)。
无论各种VM用什么算法管理内存, 造成内存泄漏的主要原因都是VM认为那些其实可以回收的内存没有被回收,比如各种数据集合中的垃圾数据,各种类静态成员占用永远不会被使用的对象。
1.数据放在各种数据集合中,但是这些数据缺不在使用,这种状况是泄漏的一大原因。
2.设置类的静态成员,然而确不会再使用了。
用leakcanary 检查对象泄漏
leakcanary工作机制:
leakcanary 分成两部分,一部分是带检测程序,在这部分里面嵌入监控对象refWatcher.watch(obj);这部分会产生一个hprof文件。
在android4.0之后,framework有ActivityLifecycleCallbacks机制,在Application的某个地方注册一个ActivityLifecycleCallbacks,然后在Activity的所谓几大生命周期都会回调这个对象的相关函数。如果不是android4.0之后,还是要手动refWatcher.watch(activity)添加监控
另外一部分是在另外的一个进程中的 HeapAnalyzerService 有一个 HeapAnalyzer 使用HAHA 解析hprof这个文件。
集合中数据泄漏:
public class LeakActivity extends Activity {
static LinkedList list=new LinkedList<>();
}
然后再某个地方将数据放入到list中,back回来,当产生hprof文件的时候,就会有泄漏信息可以查询到。同样的方式可以导致activity对象不能回收,产生所谓的泄漏。
不过个人觉得leakcanary并不是一个理想的内存检测工具,它需要在代码中维护监测对象,对实际代码影响太大,维护很麻烦。
看到许多介绍memory monitor这个工具的,可惜我的电脑太差,跑不起android studio ,这个工具似乎没有像leakcanary 这般伤害代码的,可是现在我还不知到这如何使个工具脱离android stuido 运行。 不过看介绍这个工具似乎不能确定内存泄漏点(那些对象没有被回收)。
allocation tracker 这个工具能够观察到所有分配过对象的信息(对象大小,在哪个函数、那个线程分配的),但是不能观察到到底是哪个到目前是没有被回收的。
有人说heap view是一个好工具,这个工具只能观察到某段时间内,内存整体情况,这是个用来把握App整体内存使用的工具,heap view 其实和memory monitor是同一类工具,只不过memory monitor 用图形表达出来了。
查找了许多介绍,在内存泄漏方面还是leakcanary 和allocation tracker配合着使用最好,leakcanary 能够确定对象是否还存活,allocation tracker确定对象分配位置。
android 常见的泄漏内存方法和 leakcanary 使用方法的更多相关文章
- Android HTTP实例 使用GET方法和POST方法发送请求
Android HTTP实例 使用GET方法和POST方法发送请求 Web程序:使用GET和POST方法发送请求 首先利用MyEclispe+Tomcat写好一个Web程序,实现的功能就是提交用户信息 ...
- $(document).ready()即$()方法和window.onload方法的比较
以浏览器装载文档为例,我们都知道在页面完毕后,浏览器会通过JavaScript为DOM元素添加事件.在常规的JavaScript代码中,通常使用window.onload方法,而在jQuery中,使用 ...
- Server.Transfer方法,Server.Execute方法和Response.Redirect方法有什么异同
(1)Server.Transfer方法: Server.Transfer("m2.aspx");//页面转向(服务器上执行). 服务器停止解析本页,保存此页转向前的数据后,再使页 ...
- java——多线程——单例模式的static方法和非static方法是否是线程安全的?
单例模式的static方法和非static方法是否是线程安全的? 答案是:单例模式的static方法和非static方法是否是线程安全的,与单例模式无关.也就说,如果static方法或者非static ...
- synchronized 修饰在 static方法和非static方法的区别
Java中synchronized用在静态方法和非静态方法上面的区别 在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法.也可以synchroniz ...
- $(document).ready()方法和window.onload()方法
$(document).ready()方法和window.onload()方法 $(document).ready()方法是JQuery中的方法,他在DOM完全就需时就可以被调用,不必等待这些元素关联 ...
- Html.Partial方法和Html.RenderPartial方法
分布视图 PartialView 一般是功能相对独立的,类似用户控件的视图代码片段,可以被多个视图引用,引用方式如下. 1,Html.Partial方法和Html.RenderPartial方法 静态 ...
- tornado的IOLoop.instance()方法和IOLoop.current()方法区别
在使用tornado时,经常有人疑惑IOLoop.instance()方法和IOLoop.current()方法的区别是什么. IOLoop.instance() 返回一个全局 IOLoop实例. 大 ...
- 【转载】C#中double.TryParse方法和double.Parse方法的异同之处
在C#编程过程中,double.TryParse方法和double.Parse方法都可以将字符串string转换为double类型,但两者还是有区别,最重要的区别在于double.TryParse方法 ...
随机推荐
- 当table中的td内容过多,显示不完全,用省略号表示。
.format{ min-width:100px; max-width:200px; overflow:hidden; white-space:nowrap; text-overflow:ellips ...
- centos6.6 LVS+keepalived
之前有写过keepalived+mysql 和lvsDR模式的分析篇.然而LVS没有写高冗余.今天来写一篇LVS+keepalived的 LVSDR只负责转发,LVS也没有nginx后端检查功能,所 ...
- jenkins使用deploy-plugin自动构建部署war包
jenkins+ant+maven+tomcat 1安装 jenkins 使用yum安装的 # 下载库 wget -O /etc/yum.repos.d/jenkins.repo http://pkg ...
- nyoj-71
描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条独木舟最多只能乘坐两个人,且乘客的总重量不能超过独木舟的最大承载量.我们要尽量减少这次活动中的花销,所以要找出可以安置所有旅 ...
- 精通JavaScript的this关键字
小提示 阅读本文,您需要了解JS的基本常识.您将花费40分钟完成本文的阅读. JS中的this关键字让很多新老JS开发人员都感到困惑.这篇文章将对this关键字进行完整地阐述.读完本文以后,您的困惑将 ...
- 获取外部配置JDBC文件 写给自己
web项目要把配置放在WEB下 内容 Driver=com.microsoft.sqlserver.jdbc.SQLServerDriverurl=jdbc:sqlserver://192.168.3 ...
- [转]如何将SQL Server表驻留内存和检测
注意这个功能在SQL2005后已经废弃,因为SQL2005会自动管理哪些表常驻内存. 将SQL Server数据表驻留内存是SQL Server提供的一项功能,在一般小型系统的开发过程中估计很少会涉及 ...
- RabbitMQ使用相关笔记
#运行各示例脚本 [1] 1. 下载各语言的示例代码 https://github.com/rabbitmq/rabbitmq-tutorials 2. 安装pip,命令"yum -y in ...
- 【转】NGUI研究院之自适应屏幕(十)
http://www.xuanyusong.com/archives/2536 现在用unity做项目 90%都是用NGUI,并且我个人觉得NGUI应该算是比较成熟的UI插件,虽然他也存在很多问题,但 ...
- 微信公众平台开发(26) ACCESS TOKEN
本文介绍微信公众平台下Access Token的概念及获取方法. 一.Access Token access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常 ...