1、强引用(strongly reachable):
>> 创建方式:使用new关键字创建
>> 示例:StringBuilder builder= new StringBuilder();
2、软引用(softly reachable):
>> 创建方式:
1)创建一个强引用对象
2)创建该对象的软引用
3)将强引用置空
4)使用软引用获取对象
>> 示例:
A a = new A();
SoftReference sr = new SoftReference(a);
a = null;
if(sr!=null)
{
a = (A)sr.get();
}
else
{
// else it is already be recycled, so we need to rebuild it
a = new A();
sr = new SoftReference(a);
a = sr.get();
}
3、弱引用(Weakly Reachable)
>> 创建方式:
1)创建一个强引用对象
2)创建一个引用队列
3)使用引用队列创建对象的弱引用
>> 示例:
A a = new A();
ReferenceQueue rq = new ReferenceQueue();
WeakReference wr = new WeakReference(a, rq);
a = (A) wr.get();
4、虚引用(Phantomly Reachable)
>> 创建方式:同弱引用(get方法永远返回null)
>> 示例:
A a = new A();
ReferenceQueue rq = new ReferenceQueue();
PhantomReference pr = new PhantomReference(a, rq);
a = (A) pr.get(); // forever return null
>> 注意:
PhantomReference 是所有“弱引用”中最弱的引用类型。不同于软引用和弱引用,虚引用无法通过 get() 方法来取得目标对象的强引用从而使用目标对象,观察源码可以发现 get() 被重写为永远返回 null。
那虚引用到底有什么作用?其实虚引用主要被用来 跟踪对象被垃圾回收的状态,通过查看引用队列中是否包含对象所对应的虚引用来判断它是否 即将被垃圾回收,从而采取行动。它并不被期待用来取得目标对象的引用,而目标对象被回收前,它的引用会被放入一个 ReferenceQueue 对象中,从而达到跟踪对象垃圾回收的作用。
>> 创建方式:使用new关键字创建
>> 示例:StringBuilder builder= new StringBuilder();
2、软引用(softly reachable):
>> 创建方式:
1)创建一个强引用对象
2)创建该对象的软引用
3)将强引用置空
4)使用软引用获取对象
>> 示例:
A a = new A();
SoftReference sr = new SoftReference(a);
a = null;
if(sr!=null)
{
a = (A)sr.get();
}
else
{
// else it is already be recycled, so we need to rebuild it
a = new A();
sr = new SoftReference(a);
a = sr.get();
}
3、弱引用(Weakly Reachable)
>> 创建方式:
1)创建一个强引用对象
2)创建一个引用队列
3)使用引用队列创建对象的弱引用
>> 示例:
A a = new A();
ReferenceQueue rq = new ReferenceQueue();
WeakReference wr = new WeakReference(a, rq);
a = (A) wr.get();
4、虚引用(Phantomly Reachable)
>> 创建方式:同弱引用(get方法永远返回null)
>> 示例:
A a = new A();
ReferenceQueue rq = new ReferenceQueue();
PhantomReference pr = new PhantomReference(a, rq);
a = (A) pr.get(); // forever return null
>> 注意:
PhantomReference 是所有“弱引用”中最弱的引用类型。不同于软引用和弱引用,虚引用无法通过 get() 方法来取得目标对象的强引用从而使用目标对象,观察源码可以发现 get() 被重写为永远返回 null。
那虚引用到底有什么作用?其实虚引用主要被用来 跟踪对象被垃圾回收的状态,通过查看引用队列中是否包含对象所对应的虚引用来判断它是否 即将被垃圾回收,从而采取行动。它并不被期待用来取得目标对象的引用,而目标对象被回收前,它的引用会被放入一个 ReferenceQueue 对象中,从而达到跟踪对象垃圾回收的作用。