2021SC@SDUSC
Lucene中的CloseableThreadLocal类
Java的ThreadLocal类有一个严重的瑕疵那就是即便在ThreadLocal 实例本身不在被引用的情况下,其中存储的东西也需要相当长的时间才能被解除引用。原因是所有的ThreadLocal 实例共享一个map,而该map只会在指定的时间段内清除过期的条目。
CloseableThreadLocal通过接收WeakReference类型的值并且保持对每个存储值一个硬应用,当调用close()方法的时候会清楚所有的引用,这样GC就可以回收所占用的内存空间。
StrongReference 是 Java 的默认引用实现, 它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收
public static void main(String[] args) {
Object bject = new Object();
// 通过赋值创建 StrongReference
Object referent = object;
System.out.println(referent == object);
/************** true **********************/
bject = null;
System.gc();
// StrongReference 在 GC 后不会被回收
System.out.println(null == referent);
/************** false **********************/
}