文档章节

Andoid - 内存泄漏

顶层设计
 顶层设计
发布于 2017/07/09 21:42
字数 644
阅读 12
收藏 0

什么是内存泄漏?

android 内存泄漏是指进程中的某些对象(垃圾对象)已经不再使用,但是他们仍然可以直接或间接的引用到GC roots 导致无法被GC回收。无用的对象占据着内存空间,使得实际可用的内存变小,形象的说法就是内存泄露了。

GC的跟搜索算法

Android 虚拟机的垃圾回收采用的是根搜索算法。GC会从根节点(GC Roots,GC会选择一些它了解还存活的对象作为内存遍历的根节点,比方说thread stack中的变量,JNI中的全局变量,zygote中的对象(class loader加载)等)开始对heap进行遍历,部分没有直接或间接引用到GC Roots 的就是需要回收的垃圾,会被GC回收。

主要发生场景

  • Activity使用静态成员。   静态变量长期维持对大数据对象的引用,阻止垃圾回收。
  • 资源对象未及时关闭。  资源性对象如Cursor、File、Socket,应该在使用后及时关闭。未在finallay中关闭,会导致异常情况下资源对象未被释放的风险。
  • Handler临时性内存泄漏。   Handler通过发送Message与主线程交互,Message发出之后是存储在MessageQueue中的,有些Message 也不是马上就被处理的。在Message中存在一个成员变量target,是对handler的强引用,如果Message在Queue中存在的时间越长,就容易导致handler无法被回收。如果handler是非静态的,则会导致Activity或Service不会被回收。AsyncTask内部也是handler机制,同样存在内存泄漏的风险。这种内存泄漏一般是临时性的。
  • 非静态内部类的静态实例。
    非静态内部类会维持一个到外部类实例的引用,如果非静态内部类的实例是静态的,就会间接长期维持着外部类的引用,阻止被回收掉。
  • 注册对象未反注册。 未反注册会导致观察者列表里维持着对象的引用,阻止垃圾回收。常见的有注册广播接收器,注册观察者等。

预防

  • 不要维持到Activity的长久引用,一个activity的引用的生存周期应该和activity的生命周期相同。
  • 尽量使用context-application代替context-activity
  • Activity中尽量不要使用非静态内部类,可以使用静态内部类和WeakReference代替。

本文转载自:

共有 人打赏支持
顶层设计
粉丝 11
博文 41
码字总数 8966
作品 0
青岛
部门经理
详解Android核心模块及相关技术

  Android作为一个移动设备的平台,其软件层次结构包括了一个操作系统(OS),中间件(MiddleWare)和应用程序(Application)。根据Android的软件框图,其软件层次结构自下而上分为以下几个层次...

庸人谷
2013/01/04
0
0
eclipse 选中项目,右键=》Andoid Tools=》Export Unsigned Application Package,直接保存就行,这是未签名的

eclipse 选中项目,右键=》Andoid Tools=》Export Unsigned Application Package,直接保存就行,这是未签名的。未签名跟签过名的有什么区别?...

数据库维护
2013/05/10
1K
1
Java、Android 内存如何分配(简单普及知识)

一、对于Android来说,我们把存储主要分为三个部分:内存、内部存储以及外部存储。我们可以跟PC想比较来认识这三个部分。 (1)内存RAM 内存与PC的内存是一样的,是用来运行程序,不能用来永...

csdn_aiyang
2017/04/06
0
0
netty 中服务端,客户端交互的问题

public void messageReceived(ChannelHandlerContext ctx, String request) throws Exception { ChannelFuture future = ctx.write(response); } 上面的代码,可以实现服务端吧信息传递给对应......

天王盖地虎626
2014/07/02
231
0
andoid按下home键后再返回程序时,每次都重新加载

andoid按下home键后再返回程序时,每次都重新加载,列如: 一个android程序包含两个Activity,分别为MainActivity和OtherActivity,MainActivity为程序启动的Activity。如果程序正位于OtherAc...

天王盖地虎626
01/05
33
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

最全最强解析:支付宝钱包系统架构内部剖析(架构图)

支付宝系统架构概况 典型处理默认 资金处理平台 财务会计 支付清算 核算中心 交易 柔性事务 支付宝的开源分布式消息中间件–Metamorphosis(MetaQ) Metamorphosis (MetaQ) 是一个高性能、高可...

晨猫
32分钟前
4
0
竞品分析

那什么样的场景需要用关键纬度分析法分析竞品呢? 竞品分析的目的是为了看竞品们和自己产品重合的业务都具备哪些功能点,以及这些功能是怎么做的,以此确定自己产品的优化方向。 竞品们的业务...

于谦老师
40分钟前
1
0
OSChina 周三乱弹 —— 公司女同事约我

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:分享水木年华的单曲《蝴蝶花(2002年大提琴版)》 《蝴蝶花(2002年大提琴版)》- 水木年华 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
今天
1K
16
Linux环境搭建 | VMware下共享文件夹的实现

在进行程序开发的过程中,我们经常要在主机与虚拟机之间传递文件,比如说,源代码位于虚拟机,而在主机下阅读或修改源代码,这里就需要使用到 「共享文件」 这个机制了。本文介绍了两种共享文...

良许Linux
今天
9
0
JUC锁框架——AQS源码分析

JUC锁介绍 Java的并发框架JUC(java.util.concurrent)中锁是最重要的一个工具。因为锁,才能实现正确的并发访问。而AbstractQueuedSynchronizer(AQS)是一个用来构建锁和同步器的框架,使用A...

长头发-dawn
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部