美文网首页
Android内存泄漏(一):引用

Android内存泄漏(一):引用

作者: meixinxicun | 来源:发表于2017-03-22 11:19 被阅读439次

内存回收机制:

当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。我们都知道将一个对象设置为null之后,那么这个对象就不再被引用了,最终JVM就会回收它。所以我们在开发过程中需尽早释放一些无用对象的引用。

什么是引用

那么这个引用,就需要具体来说说了。我们都知道在Java中引用包括四种:强引用,软引用,弱引用,虚引用

强引用

只要引用存在,垃圾回收器永远不会回收。
强引用可通过以下代码实现
Object obj = new Object();
这个 obj对象对后面new Object的一个强引用,只有当obj这个引用被释放之后,对象才会被释放掉,这也是我们经常所用到的编码形式。

软引用

如果一个对象具有软引用,当内存空间不足,GC会回收这些对象的内存。
软引用可通过以下代码实现

Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;
sf.get();//有时候会返回null

这时候sf是对obj的一个软引用,我们可以通过sf.get()来获取这个对象,当这个对象被标记为需要回收的时候,返回值为null,我们可以通过返回值来判断是否已经被回收。

弱引用

如果一个对象具有弱引用,在GC线程扫描内存区域的过程中,不管当前内存空间足够与否,都会回收内存。
它和软引用的区别是:只具有弱引用的对象拥有更短暂的生命周期。
弱引用可通过以下代码实现

Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;
wf.get();//有时候会返回null有时候会返回null
wf.isEnQueued();//返回是否被垃圾回收器标记为即将回收的垃圾

这时候wf是对obj的一个软引用,我们可以通过wf.get()来获取这个对象,当这个对象被回收的时候,返回值为null,我们可以通过返回值来判断是否已经被回收。
我们也可以通过wf.isEnQueued();判断是否被垃圾回收器标记为即将回收的垃圾

虚引用

如果一个对象仅持有虚引用,在任何时候都可能被垃圾回收。
虚引用必须和引用队列联合使用,虚引用主要用来跟踪对象被垃圾回收的活动。
虚引用可通过以下代码实现

Object obj = new Object();
PhantomReference<Object> pf = new PhantomReference<Object>(obj);
obj=null;
pf.get();//永远返回null
pf.isEnQueued();//返回是否从内存中已经删除

虚引用是每次垃圾回收的时候都会被回收,通过虚引用的get方法永远获取到的数据为null,因此也被成为幽灵引用。
虚引用主要用于检测对象是否已经从内存中删除。

内存泄漏

我们再来说说内存泄漏和引用的关系
什么是内存泄露?一个对象不再被程序使用,但是垃圾回收器却无法回收它们,这就叫内存泄漏。
一个对象不再被使用了,为什么还无法回收呢?因为这个对象还在被引用着。
我们来看下面这段代码:

public class A {
    public int num;
}

public class B {
    public A a;
    public String name;
}

上面的代码中,A是B的一个属性,那么B对象就引用A对象,我们也可以说,B对象持有A对象的引用。
我们再来看一段代码:

A a = new A();
B b = new B();
b.a = a;
a = null;

我们把a设置为null,那么a对象就不再被程序使用,可是b对象仍然持有a对象的引用,垃圾回收器回收内存的时候就无法回收a对象,这个时候,就已经产生了内存泄漏。

好了,引用和内存泄露就先写到这里。

下一节:Android内存泄漏(二):匿名类

相关文章

  • Android 内存泄漏

    【Android 内存泄漏】 引用: ★★★ 【知识必备】内存泄漏全解析,从此拒绝ANR,让OOM远离你的身边,跟...

  • Android内存泄漏原因及解决的总结

    分三步说明Android内存泄漏的原因及解决,“内存泄漏与内存溢出的区别”,“引用方式”,“常见引发原因与解决方案...

  • Android内存泄漏(一):引用

    内存回收机制: 当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。我们都知道将一个对象...

  • Android 优化

    Android 内存优化内存溢出 , 内存泄漏 , 内存泄漏过多就导致内存溢出 Android 系统垃圾回收机制内...

  • (转载自diycode)2017 Android 面试题分享整理

    Android(安卓) Android基础知识 Android内存泄漏总结 Handler内存泄漏分析及解决 An...

  • 内存泄漏详解

    造成 Android 内存泄漏的最根本原因就是生命周期较长的对象持有生命周期较短的对象的引用 通常内存泄漏 有以下...

  • Android 基础

    1、Android布局 2、Android内存泄漏总结 3 、Handler内存泄漏分析及解决 4...

  • android内存泄露

    参考内存泄露从入门到精通三部曲之基础知识篇Android 内存泄漏总结Android内存泄漏研究Android内存...

  • Android内存泄漏场景及解决方法

    本文包括以下内容: 内存泄漏原理 Android内存泄漏发生的情况 检测内存泄漏的工具、方法 如何避免内存泄漏 更...

  • Xcode调试工具

    一.静态内存分析工具 编译阶段查找内存泄漏等问题 1.常见内存泄漏问题 常见的内存泄漏除了循环引用,CoreFou...

网友评论

      本文标题:Android内存泄漏(一):引用

      本文链接:https://www.haomeiwen.com/subject/deannttx.html