java对象的强引用、软引用、弱引用、虚引用

强引用

强引用在对象不被使用时,并且也发生了gc,但是也不会被回收,直到发生oom

1
2
3
4
5
6
7
8
9
10
/**
* 强引用
*/
public static void strongRef() {
Object strongObj = obj;
obj = null;
System.gc();
System.out.println(strongObj);
}
java.lang.Object@677327b6

软引用

软引用在即将发生OOM时,会对没有使用的对象回收。

1
2
3
4
5
6
7
8
9
10
11
/**
* 软引用
*/
public static void softRef() {
Object softObj = new Object();
SoftReference softReference = new SoftReference(softObj);
softObj = null;
System.gc();
System.out.println(softReference.get());
}
java.lang.Object@677327b6

弱引用

发生GC时,就会对没有使用的对象进行回收。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 弱引用
*/
public static void weakRef() {
Object weakObj = new Object();
WeakReference weakReference = new WeakReference(weakObj);
weakObj = null;
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.gc();;
System.out.println(weakReference.get());
}
java.lang.Object@677327b6
null

虚引用

虚引用不管在使用时还是未使用时直接取值都会是null,但是对象未被使用时(=null)会将对象放入到queue中。如果对象还在使用,则不放入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 虚引用
*/
public static void phantomRef() {
Object o = new Object();
ReferenceQueue queue = new ReferenceQueue();
PhantomReference phantomReference = new PhantomReference(o, queue);
o = null;
System.gc();
System.out.println(phantomReference.get());
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(queue.poll());
}
null
java.lang.ref.PhantomReference@677327b6