Java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象。
Java中提供了四种强度不同的引用类型,Java中提供这四种引用类型主要有两个目的:
-
第一是可以让程序员通过代码的方式决定某些对象的生命周期;
-
第二是有利于JVM进行垃圾回收。
一、强引用(Strong Reference)
使用 new 一个新对象的方式来创建强引用。
Object obj = new Object();
只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null
obj = null; //手动置null
这样一来,JVM就可以适时的回收对象了
二、软引用(Soft Reference)
被软引用关联的对象只有在内存不够的情况下才会被回收。
使用 SoftReference 类来创建软引用。
Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null; // 使对象只被软引用关联
三、弱引用(Weak Reference)
被弱引用关联的对象一定会被回收,也就是说它只能存活到下一次垃圾回收发生之前。无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。
Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;
四、虚引用(Phantom Reference)
虚引用又称为幽灵引用或者幻影引用,一个对象是否有虚引用的存在,不会对其生存时间造成影响,也无法通过虚引用得到一个对象。
为一个对象设置虚引用的唯一目的是能在这个对象被回收时收到一个系统通知。
使用 PhantomReference 来创建虚引用。
Object obj = new Object();
PhantomReference<Object> pf = new PhantomReference<Object>(obj);
obj = null;