java有几种引用?
强软弱虚
1.强引用
String o = new String("123");
只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。
2.软引用
// 假设内存最多20M,先创建一个10M的软引用
SoftReference<byte[]> m = new SoftReference<>(new byte[1024*1024*10]);
// gc 回收
System.gc();
// m还存在,没有被回收
System.out.println(m.get());
// 再创建一个新的对象占用内存15M,已经超出内存最大值,软引用会被回收掉
byte[] b = new byte[1024*1024*15];
// m 呗回收,打印出null
System.out.println(m.get());
在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常
3.弱引用
WeakReference m = new WeakReference<>(new M());
System.out.println(m.get());
System.gc();
// gc 后,弱引用被回收
System.out.println(m.get());
只要有gc,弱引用都会被回收
4.虚引用
get不到对象,但是回收的时候会给你一个信号,一般用来管理直接内存,构造函数里除了对象,还有一个队列。