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方法 ...
随机推荐
- Linux服务器中木马(肉鸡)手工清除方法
由于自己也碰到过这种情况,刚好看到这篇文章,先转载过来.的确蛮有用的哦. 首先剧透一下后门木马如下: (当然这是事后平静下来后慢慢搜出来的,那个时候喝着咖啡感觉像个自由人) 木马名称 Linux.Ba ...
- IOS第一天多线程-03线程间通信
**** #import "HMViewController.h" @interface HMViewController () @property (weak, nonatomi ...
- Network | UDP checksum
1. 校验和 ICMP,IP,UDP,TCP报头部分都有checksum(检验和)字段.IP 首部里的校验和只校验首部:ICMP.IGMP.TCP和UDP首部中的校验和校验首部和数据. UDP和TCP ...
- web.xml配置error-page
一. 通过错误码来配置error-page <error-page> <error-code>404</error-code> <location>/e ...
- phpcms流程
phpcms流程1: 安装 将下载好的文件放到www目录下 地址栏中输入 http://localhost/phpcms/install_package/install 打开安装页面 进行安装即可. ...
- 如何获取网页上的LOGO
一般公司网页上的图片都会禁止右键另存为,用截图工具接下来的图会带背景色,PS成背景透明有点费时间. 用Google Chrome 或Firefox 打开目标网页,右键点击审查元素,将鼠标放在图片上,一 ...
- angularJs指令执行的机制==大概的三个阶段
第一阶段:加载阶段 angularJs要运行的话,需要去等待angular.js加载完成,加载完之后呢,angular就会去查找到ng-app这个指令,ng-app在每个应用里面只能出现一次, 它也就 ...
- iOS:最详细的创建CocoaPods私有库教程
一.感慨 说实话,创建这个CocoaPods私有库,我愣是搞了两个星期,创建的过程中,自己的感情波动是这样的:激情四射---->有点困惑----->极度困惑----->有点失望--- ...
- ios - 自动布局框架编写(更多功能完善中)
之前用的storyboard以及xib挺多的,最近看到朋友用第三方框架---自动布局约束框架在添加控件约束的时候老实报错.后来自己就试了试纯代码创建以及约束控件.但是纯代码约束一个控件还可以,如果约束 ...
- JQuery + XML作为前后台数据交换格式实践
JQuery + xml作为前后台数据交换 JQuery提供良好的异步加载接口AJAX,可以局部更新页面数据, http://api.jquery.com/category/ajax/ xml作为一种 ...