强引用
强引用和对象关联,对象就不会回收,即使内存溢出。当强引用设置为null,可切断强引用和对象的关系。
public class StrongReferenceTest {
public static void main(String[] args) {
Student student = new Student();
student = null;
System.gc();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static class Student {
@Override
protected void finalize() throws Throwable {
System.out.println("Student 被回收了");
}
}
}
运行结果:
Student 被回收了
软引用
当内存不足的时候,会触发GC,GC之后还是内存不足,就会回收软引用的对象。设置JVM的参数:-Xmx20M
public class SoftReferenceTest {
public static void main(String[] args) {
SoftReference<byte[]> softReference = new SoftReference<byte[]>(new byte[1024 * 1024 * 10]);
System.out.println(softReference.get());
System.gc();
//gc之后对象依旧存在
System.out.println(softReference.get());
// 当内存不够用的时候,系统会触发gc。
byte[] bytes = new byte[1024 * 1024 * 10];
System.out.println(softReference.get());
}
}
运行结果:
[B@4b9af9a9
[B@4b9af9a9
null
弱引用
只要发生GC,就会被回收。
public class WeakReferenceTest {
public static void main(String[] args) {
WeakReference<byte[]> weakReference = new WeakReference<byte[]>(new byte[1024 * 1024 * 10]);
System.out.println(weakReference.get());
System.gc();
System.out.println(weakReference.get());
}
}
运行结果:
[B@4b9af9a9
null
虚引用
无法通过虚引用获取对象。当系统发生GC,会将虚引用的关联对象加入到ReferenceQueue
{
public static void main(String[] args) {
ReferenceQueue queue = new ReferenceQueue();
List<byte[]> bytes = new ArrayList<>();
PhantomReference<byte[]> reference = new PhantomReference<byte[]>(new byte[1], queue);
// System.out.println(reference.get());
new Thread(() -> {
while (true) {
Reference poll = queue.poll();
if (poll != null) {
System.out.println("虚引用被回收了:" + poll);
}
}
}).start();
// new Thread(() -> {
// for (int i = 0; i < 100; i++) {
// bytes.add(new byte[1024 * 1024]);
// }
// }).start();
System.gc();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果:
虚引用被回收了:java.lang.ref.PhantomReference@402dfd33