zoukankan      html  css  js  c++  java
  • Android性能优化--内存泄漏

    一、Java内存分配策略

    栈:基本数据类型,对象的引用(自动释放)

    堆:对象,数组(GC)

    静态存储区(方法区)

    二、Java的引用

    强引用:不能被GC回收,JVM宁可报出OOM错误也不会回收强引用对象

    软引用:内存不足回收,适合创建缓存

    弱引用:每次GC时回收,相比软引用,弱引用的对象拥有更短暂的生命周期

    虚引用:随时都能被回收,必须和引用队列联合使用,跟踪对象被GC回收的活动

    三、内存泄漏的根本原因

    较长生命周期对象持有较短生命周期对象的引用,导致较短生命周期对象无法被GC回收

    四、内存泄漏

    单例(ApplicationContext)

    非静态内部类默认持有外部类引用(Handle,Runnable,Asynctask)(1.静态内部类,2.弱引用)

    资源未关闭(资源不会被回收导致内存泄漏)

    webView(单独进程,应用占用内存过大时杀掉进程)

    避免使用static变量(懒加载)

    ...

    五、内存泄漏监测(LeakCanary)

    原理:

    1.手动触发GC,然后分析强引用的GC引用链

    2.如果存在GC引用链,说明有内存泄漏,会在你的手机上弹出提示框

    3.记录每一次内存泄漏的GC引用链,通过它可以直接定位到内存泄漏的未释放对象

    源码:

    1.Activity Destroy之后将它放在一个WeakReference中

    2.这个WeakReference关联到一个ReferenceQueue

    3.查看ReferenceQueue是否存在Activity的引用

    4.如果该Activity泄露了,Dump出heap信息,然后在去分析泄漏路径

  • 相关阅读:
    Django源码解析(1):启动程序
    python之importlib模块
    Django中间件:CsrfViewMiddleware
    Django的admin组件
    Linux学习之CentOS--CentOS6.4下Mysql数据库的安装与配置【转】
    C#读取Xml【转】
    在eclipse导入项目的步骤【转】
    Spring学习(一)——Spring中的依赖注入简介【转】
    Spring学习(二)——Spring中的AOP的初步理解[转]
    Spring之AOP
  • 原文地址:https://www.cnblogs.com/wwttsqt/p/8520741.html
Copyright © 2011-2022 走看看