美文网首页
内存泄露-基本原理

内存泄露-基本原理

作者: songyaru | 来源:发表于2017-08-04 11:36 被阅读0次

泄露对象是什么

三种内存分配

  1. 静态存储区 : 静态数据、全局static数据和常量
  2. 栈区 : 在执行函数时,函数内局部变量的存储单元
  3. 堆区 : 程序运行 new 的内存
    public class A{
       //成员变量全部存储在堆中(包括基本数据类型,引用和引用的对象实体) 
       //因为它们属于类,类对象终究是要被new出来使用的。
       int a = 1;   
       Obj f = new Obj();
       public void foo(){
           //局部变量的基本数据类型和引用存储于栈中
           int b = 2; 
           //new 出的对象实体存储于堆中
           Obj o = new Obj();
       }
    }
    // aObj 这个引用存在栈中
    // aObj new 出的对象存在堆中
    A aObj = new A();

内存泄露只针对堆内存

内存为什么会泄露

对象可达性判断

如果一个对象具有一个或多个引用,称这个对象是可达的。
如上面的例子 A aObj = new A(); JVM堆区 存储新创建的 A 的实例, 栈区存放 aObj(引用),存放的是 A 实例的地址。
此时,A 的实例是可达的,因为有 aObj 这个引用指向它。

内存回收机制

Java的内存垃圾回收机制是从程序的主要运行对象(如静态对象/寄存器/栈上指向的堆内存对象等)开始检查引用链,当遍历一遍后得到上述这些可达对象组成无法回收的对象集合,而其他孤立的不可达对象就作为垃圾回收。

实例

    private static PopSharedPreferences instance = null;
    private static Context mContext = null;
    public static PopSharedPreferences getInstance(Context context) {
        if (instance == null) {
            instance = new PopSharedPreferences(context);
        }
        return instance;
    }
    
    private PopSharedPreferences(Context context) {
        this.mContext = context;
        ....
    }
    public class PopAudioPlayer extends HomeAsBackActivity implements PopWindowParent {
        @Override
        protected void onCreate(Bundle icicle) {
            mPreferences = PopSharedPreferences.getInstance(this);
        }
    }

GC ROOTS --> .... --> PopSharedPreferences --> mContext --> PopAudioPlayer
PopAudioPlayer 销毁 ,但是 mContext 被 PopSharedPreferences 静态实例持有。 GC 无法回收 PopAudioPlayer 对象占用的堆内存。
mContext 改成 ApplicationContext 打断了 PopSharedPreferences 对象和 PopAudioPlayer 对象的引用关系。

强引用、软引用、弱引用和虚引用

  1. 强引用 用的大部分都是强引用,new 一个对象等。 GC 不会回收。
  2. 软引用 SoftReference 如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。
  3. 弱引用 WeakReference 在垃圾回收器扫描过程中,一旦发现了只具有(仅有)弱引用的对象,不管当前内存空间是否足够都会被回收。
  4. 虚引用 PhantomReference 如果一个对象仅持有虚引用,那么这个对象就如同没有任何引用一样,随时可能被GC回收。主要用来跟踪对象被GC回收的过程。

原文地址

相关文章

  • 内存泄露-基本原理

    泄露对象是什么 三种内存分配 静态存储区 : 静态数据、全局static数据和常量 栈区 : 在执行函数时,函数内...

  • 内存泄露系列文章(一) - 内存泄露原因及影响

    前言 内存泄露系列文章内存泄露系列文章(一) - 内存泄露原因及影响内存泄露系列文章(二) - 内存泄露监测及分析...

  • 内存泄露系列文章(三) - 内存泄露解决方案

    前言 内存泄露系列文章内存泄露系列文章(一) - 内存泄露原因及影响内存泄露系列文章(二) - 内存泄露监测及分析...

  • 内存溢出与内存泄露

    目录 [TOC] 1 内存泄露与内存溢出的区别 1.1 内存泄露 内存泄露(Memory Leak),指的是堆内存...

  • 内存泄漏详细分析

    首先,什么是内存泄露?经常听人谈起内存泄露,但要问什么是内存泄露,没几个说得清楚。内存泄露是指无用对象(不再使用的...

  • Java弱引用学习 WeakHashMap、ReferenceQ

    上一篇文章 Java内存泄露学习 ThreadLocal真的会内存泄露吗 提到ThreadLocal内存泄露的问题...

  • 内存优化

    内存优化主要是分析内存泄露和内存溢出。将从内存是怎么分配,内存怎么出现泄露和溢出,用工具判断什么情况出现泄露,找出...

  • 内存优化

    内存泄露的原因 四种引用类型 常见的内存泄露 1.内部类导致内存泄露 Handler 2.Context导致内存泄...

  • 内存泄漏/管理

    ARC 下内存泄露的那些点performSelector延时调用导致的内存泄露iOS ARC下几种导致内存泄露的场...

  • 源码分析:LeakCanary 如何实现内存泄露监测

    LeakCanary 是一个非常强大的内存泄露监测工具,可以实现打印内存泄露的信息。Android 的内存泄露检测...

网友评论

      本文标题:内存泄露-基本原理

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