當前位置:編程學習大全網 - 腳本源碼 - Java中的強引用,軟引用,弱引用,虛引用有什麽用

Java中的強引用,軟引用,弱引用,虛引用有什麽用

這兩天在看 Reference 相關的東西,雖然接觸到的場景不多,但感覺還是比較有用的。

在非常關心內存的情況下,有可能能派上用場。

在涉及到某壹個對象被 GC,需要得到通知,然後再做某些相關處理的時候,有可能派得上用場。

對於第壹點,目前接觸到的就是 WeakHahsMap。像我們平常寫緩存的時候,最簡單的就是在壹個類中

public static Map<String,String> user_map = new HashMap<String, String>();

然後再在全局使用它。這裏就可以參考下 Tomcat 實現的這個 LRU 緩存:tomcat/ConcurrentCache.java at trunk · apache/tomcat · GitHub,它就用到了 WeakHashMap,WeakHashMap也用到了 WeakReference,可以參考下。

WeakHahsMap 的實現原理簡單來說就是裏面的 Entry 使用繼承了 WeakReference,那麽當 Entry 的 key 不再被使用的時候,也就是被 GC 的時候,那麽該 Entry 就會進入到 ReferenceQueue 中, WeakHashMap 在妳調用相關方法的時候,那麽就會把這個 Entry 從 ReferenceQueue 中刪除,並且做相關處理(也就是把這個 key 刪除)。這時候妳就會發現,妳的壹個鍵值對沒有了。

對於第二點,目前接觸到的就是壹個 FileCleaningTracker,它的作用是,把壹個文件和壹個對象關聯起來,當這個對象被 GC 的時候,文件也幫我們刪除掉。

FileCleaningTracker 的實現簡單來說就是用了壹個虛引用。它裏面有壹個 Tracker 的內部類,他繼承自 PhantomReference,妳可以理解成 WeakHashMap中的 Entry(其實也很像了)。這個 Tracker 就和我們的關聯對象 marker 關聯起來(妳可以理解成 WeakHashMap 中的 Entry 的 key),那麽當 marker 被回收的時候,Tracker 就會被GC 弄到 ReferenceQueue 中,那麽 FileCleaningTracker 就會把 Tracker 從 ReferenceQueue 移除出來,並且執行相關操作(delete file)。

最後:

自己理解的引用(強,軟,弱虛)是和 GC 比較相關的,能夠在壹個 對象被 GC 的時候,應用程序得到通知,然後執行相關操作。像 WeakHashMap 就是這樣,底層發現 key 沒了,上層就把 entry 刪了。

ps:

第6條:消除過期對象的引用(WeakHashMap的緩存應用):願無歲月可回首

第6條:WeakHashMap擴展知識1(原理與Reference相關):願無歲月可回首

第6條:Reference應用-FileCleaningTracker:願無歲月可回首

最後的最後補充。。。

突然想起,之前自己在工作中涉及到這樣壹種情況,我需要對用戶投資的錢進行壹個每日的加息,有壹天客戶忘了把加息的數據給我,然後給了我壹份 csv 文件,讓我加上。我當時的做法是,讓運維把文件放在固定的地方,程序讀取,執行邏輯,然後運維再手動刪除。 這個時候,其實也可以通過這種 FileCleaningTracker,當讀取完之後,自動的刪除這個文件,就不用運維來做了。(這可能是壹種應用場景)

  • 上一篇:11個榮耀典藏皮膚排名
  • 下一篇:《渴望城市》評價怎麽樣?
  • copyright 2024編程學習大全網