Java中的WeakHashMap簡析
一、什么是 WeakHashMap
Map 的子類常見的有 HashMap、Hashtable、ConcurrentHashMap、LinkedHashMap 等。
WeakHashMap,直譯就是:虛弱的 HashMap。
從名字可得知其和 HashMap 有關,確實如此,WeakHashMap 功能幾乎和 HashMap 一致。
Weak,聯(lián)想java.lang.ref包下的弱引用(WeakReference),由此這里面還牽扯到了一種弱引用結構。
二、HashMap 和 WeakHashMap 的區(qū)別
先看下 WeakHashMap 和 HashMap 中單個對象的組成:
WeakHashMap.Entry 和 HashMap.Node 的不同點在于,WeakHashMap.Entry 繼承了WeakReference。
弱引用的生存期特別短。垃圾回收的時候,一旦發(fā)現(xiàn)弱引用對象,無論當前內(nèi)存空間是否充足,都會將弱引用回收。
想象一下如下場景:
- 調(diào)用兩次 size():第一次為 10,第二次就為 8 了。
- 兩次調(diào)用 isEmpty():第一次返回 false,第二次返回 true。
- 兩次調(diào)用 containsKey():第一次返回 true,第二次返回 false。
- 兩次調(diào)用 get():第一次返回一個 value,第二次返回 null。
三、使用場景
在如今的并發(fā)泛濫的大環(huán)境下,大家應該都用過緩存,緩存都是放在內(nèi)存中的,而內(nèi)存幾乎是計算機中最寶貴也是最稀缺的資源,所以需要謹慎的使用,不然很容易就出現(xiàn) OOM。
緩存的主要作用是為了更快的處理業(yè)務、降低服務器的壓力,那么就要保證緩存命中率,這里假設整個緩存是一個 key-value 結構的(以鍵值對緩存為例),HashMap 作為強引用對象在沒有主動將 key 刪除時是不會被 JVM 回收的,這樣 HashMap 中的對象就會越積越多直到 OOM 錯誤;
那么如何做到既讓緩存的命中率高又不占用那么多的內(nèi)存,這里就可以采用 WeakHashMap,當然不會有 HashMap 100% 的命中率(假設內(nèi)存足夠),但是在保證程序正常的前提下更好的實現(xiàn)了緩存這套解決方案。
WeakHashMap 內(nèi)部是通過弱引用來管理 Entry 的,弱引用的特性對應到 WeakHashMap 上意味著什么呢?
將一對 key-value 放入到 WeakHashMap 里并不能避免該 key 值被 GC 回收(除非在 WeakHashMap 之外還有對該 key 的強引用),故內(nèi)存問題也可以解決。
到此這篇關于Java中的WeakHashMap簡析的文章就介紹到這了,更多相關Java的WeakHashMap內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
關于break和continue以及l(fā)abel的區(qū)別和作用(詳解)
下面小編就為大家?guī)硪黄P于break和continue以及l(fā)abel的區(qū)別和作用(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05Java中Spring MVC接收表單數(shù)據(jù)的常用方法
Spring MVC是Spring框架中的一個模塊,用于開發(fā)基于MVC(Model-View-Controller)架構的Web應用程序,它提供了一種輕量級的、靈活的方式來構建Web應用,同時提供了豐富的功能和特性,本文給大家介紹了Spring MVC接收表單數(shù)據(jù)的方法,需要的朋友可以參考下2024-05-05Java如何將任意類型的Object對象轉(zhuǎn)換為相應的實體對象
這篇文章主要介紹了Java如何將任意類型的Object對象轉(zhuǎn)換為相應的實體對象問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01Java8 Stream對兩個 List 遍歷匹配數(shù)據(jù)的優(yōu)化處理操作
這篇文章主要介紹了Java8 Stream對兩個 List 遍歷匹配數(shù)據(jù)的優(yōu)化處理操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08idea快捷鍵生成getter和setter,有構造參數(shù),無構造參數(shù),重寫toString方式
這篇文章主要介紹了java之idea快捷鍵生成getter和setter,有構造參數(shù),無構造參數(shù),重寫toString方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11