强软弱虚——Java 中的引用类型
强引用
复制代码
软引用
复制代码
当内存不够当时候,就会被垃圾回收;
实际应用在缓存之中;
弱引用
复制代码
一旦经过垃圾回收,立即会被回收到;
应用在 ThreadLocal 中;
Spring 中的事务,为了保证多个方法也要在同一个数据库连接池的连接,就是要用一个 ThreadLocal 去实现;
一旦线程结束的时候,线程里边的 tl 对象也会被回收,如果 key 是一个强引用,则 ThreadLocal 则不会被回收,只有是一个弱引用,才会被回收;
但是 key 被回收了,key 变成 null,但是其对应的 value 没法被回收,必须手动执行 tl.remove()操作,不然还会产生内存泄漏;
为什么同时要有弱引用和 remove 方法,因为这两个是不同的对象,一个是 ThreadLocal,另一个是 Entry 对象;
WeakHashMap 也是弱引用的引用;
虚引用
复制代码
无法通过 get 方法获得值;
虚引用的作用是用于管理对外内存;
NIO 中的直接内存管理,直接管理对外的内存,叫做 Zero-Copy;
DirectByteBuffer 一旦被回收,对应的堆外内存也要被回收,否则会出现内存泄漏问题;
凡是这样的对象,给它挂一个虚引用,只要这个对象被回收,则会设置一个信息到一个队列里边,这样 JVM 就只需监听这个队列就可以回收对应到堆外内存;
评论