强引用
是使用最普遍的引用:
Object o = new Object() ;
特点:不会被GC
public static void strongReference() {
Object o = new Object();
System.out.println(o);
System.gc();
System.out.println(o);
if (o == null) {
System.out.println("强引用对象o 已被gc");
} else {
System.out.println("强引用对象o 仍存在");
}
}
执行结果:
java.lang.Object@1540e19d
java.lang.Object@1540e19d
强引用对象o 仍存在
弱引用 WeakReference
Object o = new Object();
System.out.println(o);
WeakReference<Object> wr = new WeakReference<>(o);
// 记得去除强引用,才能转化为真正的弱引用
o = null;
System.out.println(wr.get());
特点:只要gc启动,不管当前内存空间足够与否,都会回收它的内存
public static void weakReference() {
Object o = new Object();
System.out.println(o);
WeakReference<Object> wr = new WeakReference<>(o);
// 记得去除强引用,才能转化为真正的弱引用
o = null;
System.out.println(wr.get());
System.gc();
System.out.println(wr.get());
if (wr.get() == null) {
System.out.println("弱引用对象 已被gc");
} else {
System.out.println("弱引用对象 仍存在");
}
}
执行结果:
java.lang.Object@677327b6
java.lang.Object@677327b6
null
弱引用对象 已被gc
软引用 SoftReference
public static void softReference() {
Object o = new Object();
System.out.println(o);
SoftReference<Object> sr = new SoftReference<>(o);
// 记得去除强引用,才能转化为真正的软引用
o = null;
System.out.println(sr.get());
System.gc();
if (sr.get() == null) {
System.out.println("软引用对象o 已被gc");
} else {
System.out.println("软引用对象o 仍存在");
System.out.println(sr.get());
}
}
执行结果
java.lang.Object@14ae5a5
java.lang.Object@14ae5a5
软引用对象o 仍存在
java.lang.Object@14ae5a5
特点:
- 介于强引用和弱引用之间;
- 内存空间不足时,gc才会回收这些对象的内存;
- 软引用可用来实现内存敏感的高速缓存。
虚引用 PhantomReference
public static class M {
@Override
protected void finalize() throws Throwable {
System.out.println("gc M");
}
}
public static void phantomReference() {
M m = new M();
System.out.println(m);
PhantomReference<M> pr = new PhantomReference<>(m, null);
// 记得去除强引用,才能转化为真正的虚引用
m = null;
if (pr.get() == null) {
System.out.println("虚引用不可获取对象");
} else {
System.out.println("虚引用可获取对象");
System.out.println(pr.get());
}
System.gc();
}
执行结果
com.peterq.Reference$M@7f31245a
虚引用不可获取对象
gc M
特点:
- 形同虚设,也称为幻影引用;
- 无法通过虚引用来获取对一个对象的真实引用;
- 唯一的用处:能在对象被GC时收到系统通知
网友评论