文档章节

Andoid - 内存泄漏

顶层设计
 顶层设计
发布于 2017/07/09 21:42
字数 644
阅读 11
收藏 0
点赞 0
评论 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

eclipse 选中项目,右键=》Andoid Tools=》Export Unsigned Application Package,直接保存就行,这是未签名的

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

数据库维护 ⋅ 2013/05/10 ⋅ 1

Java、Android 内存如何分配(简单普及知识)

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

csdn_aiyang ⋅ 2017/04/06 ⋅ 0

andoid按下home键后再返回程序时,每次都重新加载

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

天王盖地虎626 ⋅ 01/05 ⋅ 1

netty 中服务端,客户端交互的问题

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

天王盖地虎626 ⋅ 2014/07/02 ⋅ 0

fragment+viewPage 界面出现假死情况,

今天遇到一个奇葩BUG,fragment+viewpage 界面数据多层叠加在一起,表层数据数据出现假死,列表数据可以在后面滑动。 一、底部TAB,一般3-5个,点击某个TAB,上面页面也随之切换,早期的时候A...

Remix_jx ⋅ 2016/07/07 ⋅ 0

AndroidManifest.xml文件详解(category)

语法(SYNTAX): 包含于(CONTAINED IN): 说明(DESCRIPTION): 给一个过滤器添加一个分类的名称。有关Intent过滤器的详细说明以及过滤器中分类规范的作用,请看Intent and Intent Filte...

长平狐 ⋅ 2012/10/16 ⋅ 0

PhoneGap 1.8.1 发布,跨平台移动开发框架

PhoneGap官方今天发布了PhoneGap 1.8.1版本,主要修复了1.8版本中导致iOS平台上PhoneGap应用程序崩溃的bug。 该版本相对于之前的1.7版本,主要修复了iOS、Android、Windows Phone、黑莓和Web...

oschina ⋅ 2012/06/14 ⋅ 3

基于 UDP 的推送系统--guda-push

guda-push 是基于 UDP 的推送系统。guda-push 专注 Android 和 iOS 推送。针对耗电量,流量在协议,消息传输方式上做了优化。 特性: 1)基于udp,不采用长连接是因为app在手机上活动时间每天可...

foodoon ⋅ 2014/12/17 ⋅ 0

android里的线程和进程

进程 默认情况下,同一个应用程序内的所有组件都是运行在同一个进程中的,大部分应用程序也不会去改变它。不过,如果需要指定某个特定组件所属的进程,则可以利用manifest 文件来达到目的。 ...

tomcater ⋅ 2014/04/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Day 17 vim简介与一般模式介绍

vim简介 vi和Vim的最大区别就是编辑一个文件时vi不会显示颜色,而Vim会显示颜色。显示颜色更便于用户编辑,凄然功能没有太大的区别 使用 yum install -y vim-enhanced 安装 vim的三种常用模式...

杉下 ⋅ 58分钟前 ⋅ 0

【每天一个JQuery特效】根据可见状态确定是否显示或隐藏元素(3)

效果图示: 主要代码: <!DOCTYPE html><html><head><meta charset="UTF-8"><title>根据可见状态确定 是否显示或隐藏元素</title><script src="js/jquery-3.3.1.min.js" ty......

Rhymo-Wu ⋅ 今天 ⋅ 0

OSChina 周四乱弹 —— 初中我身体就已经垮了,不知道为什么

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @加油东溪少年 :下完这场雨 后弦 《下完这场雨》- 后弦 手机党少年们想听歌,请使劲儿戳(这里) @马丁的代码 :买了日本 日本果然赢了 翻了...

小小编辑 ⋅ 今天 ⋅ 12

浅谈springboot Web模式下的线程安全问题

我们在@RestController下,一般都是@AutoWired一些Service,由于这些Service都是单例,所以并不存在线程安全问题。 由于Controller本身是单例模式 (非线程安全的), 这意味着每个request过来,...

算法之名 ⋅ 今天 ⋅ 0

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部