虽然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 使用方法的更多相关文章

  1. Android HTTP实例 使用GET方法和POST方法发送请求

    Android HTTP实例 使用GET方法和POST方法发送请求 Web程序:使用GET和POST方法发送请求 首先利用MyEclispe+Tomcat写好一个Web程序,实现的功能就是提交用户信息 ...

  2. $(document).ready()即$()方法和window.onload方法的比较

    以浏览器装载文档为例,我们都知道在页面完毕后,浏览器会通过JavaScript为DOM元素添加事件.在常规的JavaScript代码中,通常使用window.onload方法,而在jQuery中,使用 ...

  3. Server.Transfer方法,Server.Execute方法和Response.Redirect方法有什么异同

    (1)Server.Transfer方法: Server.Transfer("m2.aspx");//页面转向(服务器上执行). 服务器停止解析本页,保存此页转向前的数据后,再使页 ...

  4. java——多线程——单例模式的static方法和非static方法是否是线程安全的?

    单例模式的static方法和非static方法是否是线程安全的? 答案是:单例模式的static方法和非static方法是否是线程安全的,与单例模式无关.也就说,如果static方法或者非static ...

  5. synchronized 修饰在 static方法和非static方法的区别

    Java中synchronized用在静态方法和非静态方法上面的区别 在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法.也可以synchroniz ...

  6. $(document).ready()方法和window.onload()方法

    $(document).ready()方法和window.onload()方法 $(document).ready()方法是JQuery中的方法,他在DOM完全就需时就可以被调用,不必等待这些元素关联 ...

  7. Html.Partial方法和Html.RenderPartial方法

    分布视图 PartialView 一般是功能相对独立的,类似用户控件的视图代码片段,可以被多个视图引用,引用方式如下. 1,Html.Partial方法和Html.RenderPartial方法 静态 ...

  8. tornado的IOLoop.instance()方法和IOLoop.current()方法区别

    在使用tornado时,经常有人疑惑IOLoop.instance()方法和IOLoop.current()方法的区别是什么. IOLoop.instance() 返回一个全局 IOLoop实例. 大 ...

  9. 【转载】C#中double.TryParse方法和double.Parse方法的异同之处

    在C#编程过程中,double.TryParse方法和double.Parse方法都可以将字符串string转换为double类型,但两者还是有区别,最重要的区别在于double.TryParse方法 ...

随机推荐

  1. FineUi导出时禁用ajax即EnableAjax="false"出现问题的解决方法

    fineui导出时会出现乱码, 在按钮上添加EnableAjax="false"属性禁用ajax就可以正常导出.但如果我在后台代码中直接return 而不进行导出流操作,则前台脚本 ...

  2. Linux_shell脚本_遍历文件夹下所有文件

    参考:lunar1983的专栏 实现:从给定目录树中grep出含制定字符串的行,并给出所在路径 代码如下所示: #!/bin/sh - if [ $# -ne 2 ] then echo " ...

  3. js的extend和fn.extend使用

    $.fn.extend扩展的是一个jQuery对象函数,$.extend扩展的是一个jQuery全局函数 <!DOCTYPE html> <html> <head> ...

  4. Lambda表达式公共拼接函数(原创)

    #region Lambda公共拼接函数 /// <summary> /// LambdaWhere(枚举) /// </summary> public enum Lambda ...

  5. java类集框架图(google找的,备个份)

  6. 累积进度图及本周PSP饼状图

    每周进度   项目:词频统计  项目类型:个人项目 项目完成情况:已完成 C类别 C内容 S开始时间 E结束时间 I间隔 T净时间 分析 需求,设计 10:00 10:49 20 29 编码 代码的实 ...

  7. C#抽象类、抽象方法、虚方法

    定义抽象类和抽象方法: abstract 抽象类特点: 1.不能初始化的类被叫做抽象类,它们只提供部分实现,但是另一个类可以继承它并且能创建它们的实例 2.一个抽象类可以包含抽象和非抽象方法,当一个类 ...

  8. PHP读文件的一个乱码问题

    D:/3.txt是utf-8文件 $f1 = fopen('D:/3.txt','r');$str = fread($f1,10000);fclose($f1);echo substr($str,1, ...

  9. lsof 一切皆文件

    Docs » 工具参考篇 » 3. lsof 一切皆文件 Docs » 工具参考篇 » 3. lsof 一切皆文件 Edit on GitHub 3. lsof 一切皆文件¶ lsof(list op ...

  10. Ruby零星笔记

    chomp:去掉字符串末尾的\n或\r chop:去掉字符串末尾的最后一个字符,不管是\n\r还是普通字符 to_s:转换成字符串 to_i:转换成数值 object.nil?:判断是否为空,空返回: ...