1、java中的引用
强、软、弱、虚
(1)、强引用
M m = new M()
- 调用GC时,即使栈空间被占满也只会抛出内存溢出异常而不会回收空间。
- m = null,将引用指向null,在下次GC时空间会被回收。
(2)、软引用
//m指向SoftReference,SoftReference中有一个软引用指向new byte[1024*1024*10]
//当有一个对象被软引用指向时,只有系统内存(堆内存)不够用才会被GC回收
SoftReference<byte[]> m = new SoftReference<>(new byte[1024*1024*10]);
- 软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围进行第二次回收。
- 软引用是用来描述一些还有用但并非必须的对象,软引用非常适合缓存使用
(3)、弱引用
WeakReference<M> m = new WeakReference<>(new M());
- 弱引用遭到gc就会回收
- 应用:1、ThreadLocal Thread.currentThread.map(ThreadLocal,Value)设置到当前线程的map中 。ThreadLocal是一个弱引用 2、WeakHashMap 3、redis(c)也是用的弱引用
(4)、虚引用
PhantomReference<M> phantomReference = new PhantomReference<>(new M(), QUEUE);
- 一个对象是否有虚引用的存在,完全不会对其生存时间构成影响
- 无法通过虚引用来获取一个对象的实例
- 为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知
- 虚引用有一个很重要的用途就是用来做堆外内存的释放