写点什么

强软弱虚——Java 中的引用类型

用户头像
少平
关注
发布于: 2021 年 03 月 16 日

强引用

M m = new M();
复制代码

 

软引用

SoftReference<byte[]> m = new SoftReference<>(new byte[1024]);System.out.println(m.get());
复制代码

当内存不够当时候,就会被垃圾回收;

实际应用在缓存之中;

 

弱引用

WeakReference<M> m = new WeakReference(new M());System.out.println(m.get());
复制代码

一旦经过垃圾回收,立即会被回收到;

应用在 ThreadLocal 中;

Spring 中的事务,为了保证多个方法也要在同一个数据库连接池的连接,就是要用一个 ThreadLocal 去实现;



一旦线程结束的时候,线程里边的 tl 对象也会被回收,如果 key 是一个强引用,则 ThreadLocal 则不会被回收,只有是一个弱引用,才会被回收;

 

但是 key 被回收了,key 变成 null,但是其对应的 value 没法被回收,必须手动执行 tl.remove()操作,不然还会产生内存泄漏;

 

为什么同时要有弱引用和 remove 方法,因为这两个是不同的对象,一个是 ThreadLocal,另一个是 Entry 对象;



WeakHashMap 也是弱引用的引用;

 

虚引用

ReferenceQueue<M> QUEUE = new ReferenceQueue();PhantomReference<M> phantomReference = new PhantomReference<>(new M(), QUEUE);System.out.println(phantomReference.get());
复制代码

无法通过 get 方法获得值;

虚引用的作用是用于管理对外内存;

NIO 中的直接内存管理,直接管理对外的内存,叫做 Zero-Copy;



DirectByteBuffer 一旦被回收,对应的堆外内存也要被回收,否则会出现内存泄漏问题;

凡是这样的对象,给它挂一个虚引用,只要这个对象被回收,则会设置一个信息到一个队列里边,这样 JVM 就只需监听这个队列就可以回收对应到堆外内存;


用户头像

少平

关注

路虽远,行则将至;事虽难,做者必成 2017.10.17 加入

程序员,爱好读书,终身成长者

评论

发布
暂无评论
强软弱虚——Java中的引用类型