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方法 ... 
随机推荐
- 关于百度分享——bdCustomStyle一点bug
			最近碰到一个项目,因为用上百度分享,出现了奇怪的bug. 具体是,当访问JSP页面时,js脚本会执行一次,而java脚本执行了两次. 最后排查发现是百度分享js脚本的问题,把"bdCusto ... 
- iOS 如何通过CocoaPods添加第三方框架
			一 先安装Ruby环境: http://ruby-china.org/wiki/install_ruby_guide 在安装的时候,若是出现: 1.You don't have write perm ... 
- AESUtils.java
			package com.vcredit.framework.utils; import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySp ... 
- HttpClient模拟http请求
			Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且 ... 
- C# Math
			Math.Ceiling 向上进位取整.例如:Math.Ceiling(32.6)=33; Math.Ceiling(32.0)=32; Math.Floor 向下舍位取整.例如:Math.Floor ... 
- Wordpress实现站搜索
			wordpress内置的搜索表单如下 <form role="search" method="get" id="searchform" ... 
- Hibernate n+1问题
			转自: http://www.blogjava.net/RoyPayne/archive/2012/01/30/369017.htmlhttp://msi110.iteye.com/blog/7101 ... 
- DHCP中继
			DHCP中继 要求: 假设公司现在有两个部门分别为 销售部门,生产部门 对这两个部门分配不同网段, 销售部门 192.168.1.0/24 生产部门 192.168.2.0/24 为了节约使用LINU ... 
- Git merge 与 git rebase的区别
			Git merge的用法: git merge Dev // Dev表示某分支,表示在当前分支合并Dev分支 git merge -m "Merge from Dev" Dev ... 
- cat <<EOF用法
			转自:http://blog.csdn.net/apache0554/article/details/45508631 cat <<EOF和cat <<-EOF两个都是获取st ... 
