Lucene原始碼解析--Lucene中的CloseableThreadLocal類
Java的ThreadLocal類有一個嚴重的瑕疵那就是即便在ThreadLocal 例項本身不在被引用的情況下,其中儲存的東西也需要相當長的時間才能被解除引用。原因是所有的ThreadLocal 例項共享一個map,而該map只會在指定的時間段內清除過期的條目。
CloseableThreadLocal透過接收WeakReference型別的值並且保持對每個儲存值一個硬應用,當呼叫close()方法的時候會清楚所有的引用,這樣GC就可以回收所佔用的記憶體空間。
Java 中一共有 4 種型別的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference。
一:Strong Reference
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 **********************/
}
二:WeakReference & WeakHashMap
WeakReference, 顧名思義, 是一個弱引用, 當所引用的物件在 JVM 內不再有強引用時, GC 後 weak reference 將會被自動回收
public static void main(String[] args) {
Object bject = new Object();
// 建立 WeakReference
WeakReference
CloseableThreadLocal透過接收WeakReference型別的值並且保持對每個儲存值一個硬應用,當呼叫close()方法的時候會清楚所有的引用,這樣GC就可以回收所佔用的記憶體空間。
Java 中一共有 4 種型別的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference。
一:Strong Reference
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 **********************/
}
二:WeakReference & WeakHashMap
WeakReference, 顧名思義, 是一個弱引用, 當所引用的物件在 JVM 內不再有強引用時, GC 後 weak reference 將會被自動回收
public static void main(String[] args) {
Object bject = new Object();
// 建立 WeakReference
WeakReference
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-763745/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Lucene原始碼解析--Field類原始碼
- Lucene原始碼解析--Lock檔案原始碼
- Lucene原始碼解析--搜尋過程<二>原始碼
- Lucene原始碼解析--刪除文件檔案(.del)原始碼
- Lucene原始碼解析--Compound File 組合檔案原始碼
- 利用Lucene搜尋Java原始碼Java原始碼
- Lucene原始碼解析--IndexWriterConfig配置引數說明原始碼Index
- lucene(一) lucene一些概念的理解
- 看Lucene原始碼必須知道的基本概念原始碼
- 初探Lucene
- Lucene教程
- 【Lucene&&Solr】Lucene索引和搜尋流程Solr索引
- Lucene學習
- lucene學習總結篇--lucene全文檢索的基本原理和lucene API簡單的使用API
- lucene第一步,lucene基礎,索引建立索引
- lucene、lucene.NET詳細使用與優化詳解優化
- Lucene學習一
- lucene入門使用
- Lucene查詢原理
- 看Lucene原始碼必須知道的基本規則和演算法原始碼演算法
- lucene中ParallelReader.java使用中的難點ParallelJava
- Lucene打分公式的推導公式
- Lucene字典的實現原理
- Lucene.jar的問題JAR
- lucene和NoSQL的結合SQL
- Lucene的分頁查詢
- lucene 總結收集(url)
- lucene 自定義評分
- Lucene 排序 Sort與SortField排序
- Lucene建立索引流程索引
- lucene Filter過濾器Filter過濾器
- lucene字典實現原理
- Lucene五分鐘教程
- Apache Lucene 4釋出Apache
- lucene入門問題
- Lucene學習總結之八:Lucene的查詢語法,JavaCC及QueryParser(1)Java
- Tantivy與Quickwit:類似Lucene的Rust全文搜尋引擎庫UIRust
- 深度解析 Lucene 輕量級全文索引實現原理索引