1.强引用
A a =new A();//此为强引用
任何强引用对象都不会被gc回收机制回收
2.软引用SoftReference
- 一般用户实现Java对象的缓存,缓存可以有可以没有,一般将有用但是非必须的对象用软引用关联
- 只要是软引用关联的对象,在Java发生内存溢出异常之前,会将这些对象列入要回收的范围,如果回收之后发现内存还是不够,才会抛出OOM异常
class MyArray{
byte[]bytes=new byte[3*1024*1024];
}
public class TestDemo8 {
public static void main(String[] args) {
//软引用对象
//引用队列
ReferenceQueue<MyArray> queue = new ReferenceQueue<>();
//创建一个软引用对象
SoftReference<MyArray> softReference = new SoftReference<>(new MyArray(), queue);
//获取软引用对象
System.out.println(softReference.get());
//判断是否被回收
System.out.println(softReference.isEnqueued());
System.gc();
System.out.println(softReference.get());
System.out.println(softReference.isEnqueued());
}
}
此时运行的到结果:
此时由于并没有修改内存,故返回为false。
修改内存后,再增加一个3M的数组,此时运行结果如下:
此时可以得到返回为true,证明前者被垃圾回收。
3.弱引用 WeakReference
- 弱引用是用来一些非必须的对象,比软引用更弱一些
- 只要是被弱引用关联的对象,只能够生存到下一次垃圾回收之前,一旦发生垃圾回收,无论当前内存是否够用,都会回收掉被弱饮用关联的对象
class Test{
}
public class TestDemo8 {
public static void main(String[] args) {
//弱引用对象
ReferenceQueue<Test> queue = new ReferenceQueue<>();
WeakReference<Test> weakReference = new WeakReference<>(new Test(), queue);
System.out.println(weakReference.get());
//判断是否被回收
System.out.println(weakReference.isEnqueued());
System.gc();
System.out.println(weakReference.get());
System.out.println(weakReference.isEnqueued());
}
}
运行结果:
只能存活在下次垃圾回收之前。
4.虚引用 PhantomReference
- 别名幽灵引用,最弱的引用关系,一个对象是否具有虚引用的存在,完全是不会对其生命周期产生影响,也无法通过虚引用获取一个对象的实例,它存在的唯一目的就是在对象被垃圾回收之后收到一个系统通知。