1.强引用
这类引用存在,GC永远不会回收这类引用;
2.软引用
Java对象的高速缓存 ,描述 一些有用但是非必须的对象
GC在内存充足时不会回收掉软引用对象,在内存不充足时会回收掉软引用对象
默认内存空间为5兆 -Xms5m -Xmx5m
class MyArray{
byte[] bytes = new byte[3 * 1024 * 1024];
}
public class Test31 {
public static void main(String[] args) {
//软引用对象
ReferenceQueue<MyArray> queue = new ReferenceQueue<>();
//将MyArray对象包装成一个软引用对象
SoftReference<MyArray> reference = new SoftReference<>(new MyArray(),queue);
System.out.println(reference.get());
System.out.println(reference.isEnqueued());//判断当前的对象是否被回收
System.out.println(queue.poll());
//System.gc();//垃圾回收
byte[] array = new byte[3 * 1024 * 1024];
System.out.println(reference.get());
System.out.println(reference.isEnqueued());//判断当前的对象是否被回收
System.out.println(queue.poll());
}
}
运行结果:
MyArray@1b6d3586
false
null
null
true
java.lang.ref.SoftReference@4554617c
超出内存空间,被回收的对象就会放入java.lang.ref.SoftReference@4554617c这个队列里面;
软引用适合做缓存,在内存足够时,直接通过软引用取值,无需从真实来源中查询数据,可以显著地提升网站性能。当内存不足时,能让JVM进行内存回收,从而删除缓存,这时候只能从真实来源查询数据
3.弱引用
只能生存到下一次GC之前,当GC工作时,无论当前内存是否充足,GC都会回收掉与弱引用关联的对象
class A{
}
public class Test31 {
public static void main(String[] args) {
//弱引用对象
ReferenceQueue<A> queue = new ReferenceQueue<>();
WeakReference<A> reference = new WeakReference<>(new A(),queue);
System.out.println(reference.get());
System.out.println(reference.isEnqueued());//判断当前的对象是否被回收
System.out.println(queue.poll());
System.gc();
System.out.println(reference.get());
System.out.println(reference.isEnqueued());//判断当前的对象是否被回收
System.out.println(queue.poll());
}
}
运行结果:
A@1b6d3586
false
null
null
true
java.lang.ref.WeakReference@4554617c
弱引用的生命周期比较短暂,一旦进行垃圾回收,弱引用就会被回收掉,可以将一些临时变量或者生命周期短的对象包装成弱引用对象;
4.虚引用 (幽灵引用)
一个对象是否有虚引用的存在,完全不会对其生命周期造成影响,也无法通过虚引用来获取一个对象的实例,唯一可以使用虚引用来判断当前对象是否已经被垃圾回收;
class A{
}
public class Test31 {
public static void main(String[] args) {
//虚引用对象
ReferenceQueue<A> queue = new ReferenceQueue<>();
PhantomReference<A> ptr = new PhantomReference<>(new A(),queue);
System.gc();
System.out.println(ptr.isEnqueued());
}
}
运行结果:有时为true,有时为false;