强引用,软引用,弱引用,虚引用
- java有不同的引用类型,分别是:强引用,软引用,弱引用,虚引用,不同的引用类型跟我们的垃圾回收也有着不同的规则
强引用
我们直接通过new 关键字创建出来的对象都叫做强引用对象例如:
Object obj = new Object();
强引用的特点
- 强引用可以直接访问目标对象
- 强引用所指向的对象在任何时候都不会被系统回收,JVM宁愿抛出OOM异常,也不会回收强引用所指向的对象
- 强引用可能导致内存泄漏
软引用
软引用是除了强引用外,最强的引用类型,可以通过java.lang.ref.SoftReference使用软引用,一个持有软引用的对象,不会被jvm很快回收,jvm会根据当前堆的使用情况来判断何时回收(只有当JVM认为内存不足时,才会试图去回收软引用的对象,JVM会确保抛出OutOfMemoryError之前,清理软引用指向的对象),因此,软引用可以用于实现对内存敏感的高速缓存
User user = new User();
SoftReference<User> sofitReference = new SoftReference<>(user);//创建一个软引用对象指向上面的强引用对象
User = null;//销毁强引用
System.gc();//手动垃圾回收
System.out.println(softReference.get());//打印软引用中User对象地址值
注意: 触发软引用回收的点在于内存空间已经装不下的时候,以及内存空间很紧张的时候执行回收
上述代码流程分析
注意:软引用理论上来说属于GC_Roots对象,但是,当JVM进行软引用对象的回收的时候,一样会将引用回收,所以GC_Root对象并不是不能被回收的
弱引用
弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要JVM开始进行垃圾回收,那些被弱引用关联的对象都会被回收,再JDK1.2之后,用Java.lang.ref.WeakReference来表示弱引用
User user = new User();
WeekReference wReference = new WeekReference(user);
user = null;
System.out.println(wReference);
同理,弱引用也是会在垃圾回收器回收对象时,将引用清除, 同时,这种引用其实也是GC_Roots
虚引用
虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么他就和没有任何引用一样,他随时可能会被回收,再jdk1.2之后,用PhantomReference类来表示,通过查看这个类的源码,我们可以发现他只有一个构造函数和一个get()方法,而且他的get()方法仅仅返回一个null,也就是说永远无法通过虚引用来获取对象,虚引用必须要和ReferenceQueue引用队列一起使用,虚引用在创建时必须传入一个引用队列作为参数,当垃圾收集器准备回收一个对象时,如果发现她还有虚引用,就会再回收对象后,将这个虚引用加入到引用队列,以通知引用 程序对象的回收情况