文档章节

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代替。

本文转载自:

共有 人打赏支持
顶层设计
粉丝 12
博文 41
码字总数 8966
作品 0
青岛
部门经理
私信 提问
如何定位和解决内存泄露

由于内存泄露导致的游戏BUG的情况。在TestBird手游测试平台上的发生频率很高,我也在此前的文章中谈到过内存占用过高会对手机中的应用造成的影响,今天我们再深入探讨一下内存泄露的问题。 ...

aabbc
2016/07/27
231
1
Android中常见的内存泄漏问题及解决办法

在android开发中,内存泄漏是比较常见的问题,但为什么会出现内存泄漏呢?当一个对象已经不需要再使用了,本该被回收时,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导...

SilenceOO
2017/10/30
0
0
Android常见内存泄漏简单处理

本篇文章主要说一下项目结束时简单的内存泄漏检查与处理。 什么是内存泄漏? 内存泄漏(memory leak):是指应用在申请资源(内存)后,资源(内存)没有得到及时的释放。 区别: 内存溢出(out...

深情不及酒伴
2017/09/07
0
0
内存泄漏原因及解决方案

什么是内存泄漏? 内存泄漏是当程序不再使用到的内存时,释放内存失败而产生了无用的内存消耗。内存泄漏并不是指物理上的内存消失,这里的内存泄漏是值由程序分配的内存但是由于程序逻辑错误...

Magic_锋
2016/07/13
94
0
深入分析 ThreadLocal 内存泄漏问题

前言 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。但是如果滥用 ,就可能会导致内存泄漏。下面,我...

Hosee
2016/08/08
415
0

没有更多内容

加载失败,请刷新页面

加载更多

webpack4 css打包、压缩、分离、去重等优化配置详解

Webpack 4 目前版本已经到了4.27 相较于前面的版本还是有一些改动的,具体可以参考升级指南 迁移到新版本 这里只介绍 css 的 打包、压缩、分离、去重 的方法; 不懂的或者有更优的方案,欢迎...

zerokb-小浪
14分钟前
0
0
基于协同过滤算法的推荐

基于协同过滤算法的推荐 (本实验选用数据为真实电商脱敏数据,仅用于学习,请勿商用) 数据挖掘的一个经典案例就是尿布与啤酒的例子。尿布与啤酒看似毫不相关的两种产品,但是当超市将两种产...

阿里云官方博客
22分钟前
0
0
Tomcat配置强制https端口变成8443的解决办法

Tomcat配置强制https端口变成8443的解决办法 2017年10月18日 10:44:10 我们始终是路人 阅读数:2953 标签: tomcathttps8443443 更多 个人分类: Tomcat 版权声明:本文为博主原创文章,未经...

linjin200
24分钟前
0
0
基于协同过滤算法的推荐

基于协同过滤算法的推荐 (本实验选用数据为真实电商脱敏数据,仅用于学习,请勿商用) 数据挖掘的一个经典案例就是尿布与啤酒的例子。尿布与啤酒看似毫不相关的两种产品,但是当超市将两种产...

阿里云云栖社区
25分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部