java中强引用,软引用,弱引用,虚引用

1、强引用

强引用是最普遍的引用,我们一般new创建出来的对象的引用都为强引用。强引用不会被jvm强制回收,就算jvm内存不够继续分配,抛出OOM,也不会随意回收强引用。

public class A {
public void aa()
{
System.out.println("引用测试");
}
}

A a = new A();

2、软引用

如果一个对象只有软引用,如果jvm内存空间足够,则不会回收它,如果内存空间不够,就会回收它。软引用一般用来实现比较敏感的高速缓存。

public class A {
public void aa()
{
System.out.println("引用测试");
}
}

public class TestReference {
public static void main(String[] args) {
A a = new A();
SoftReference<A> ref = new SoftReference<A>(a);
ref.get().aa();
}
}

运行结果:引用测试

3、弱引用

弱引用的对象拥有更短暂的生命周期,只要垃圾回收器的线程扫描到弱引用的对象,不管当前jvm内存是否够不够,都会回收掉弱引用的对象。不过,由于垃圾回收器是一个优先级很低的线程,所以不一定会很快发现那些弱引用的对象。

public class A {
public void aa()
{
System.out.println("引用测试");
}
}

public class TestReference {
public static void main(String[] args) {
A a = new A();
WeakReference<A> ref = new WeakReference<A>(a);
ref.get().aa();
}
}

运行结果:引用测试

4、虚引用

虚引用与上面几种引用都不同,并不会决定对象的生命周期。如果一个对象仅只有虚引用,那就和没有任何引用一样,在任何时候都可能被回收。虚引用与软引用和弱引用的还有一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。虚引用主要用来跟踪对象被垃圾回收器回收的活动

public class A {
public void aa()
{
System.out.println("引用测试");
}

}

public class TestReference {
public static void main(String[] args) {
A a = new A();
ReferenceQueue<A> queue = new ReferenceQueue<A>();
PhantomReference<A> ref = new PhantomReference<A>(a, queue);
ref.get().aa();
}

}

运行结果:Exception in thread "main" java.lang.NullPointerException

参考博文:http://www.cnblogs.com/skywang12345/p/3154474.html

猜你喜欢

转载自blog.csdn.net/zhenwei1994/article/details/79723609