Java中的WeakHashMap簡析
一、什么是 WeakHashMap
Map 的子類常見的有 HashMap、Hashtable、ConcurrentHashMap、LinkedHashMap 等。
WeakHashMap,直譯就是:虛弱的 HashMap。
從名字可得知其和 HashMap 有關(guān),確實(shí)如此,WeakHashMap 功能幾乎和 HashMap 一致。
Weak,聯(lián)想java.lang.ref包下的弱引用(WeakReference),由此這里面還牽扯到了一種弱引用結(jié)構(gòu)。
二、HashMap 和 WeakHashMap 的區(qū)別
先看下 WeakHashMap 和 HashMap 中單個(gè)對(duì)象的組成:

WeakHashMap.Entry 和 HashMap.Node 的不同點(diǎn)在于,WeakHashMap.Entry 繼承了WeakReference。
弱引用的生存期特別短。垃圾回收的時(shí)候,一旦發(fā)現(xiàn)弱引用對(duì)象,無論當(dāng)前內(nèi)存空間是否充足,都會(huì)將弱引用回收。
想象一下如下場景:
- 調(diào)用兩次 size():第一次為 10,第二次就為 8 了。
- 兩次調(diào)用 isEmpty():第一次返回 false,第二次返回 true。
- 兩次調(diào)用 containsKey():第一次返回 true,第二次返回 false。
- 兩次調(diào)用 get():第一次返回一個(gè) value,第二次返回 null。
三、使用場景
在如今的并發(fā)泛濫的大環(huán)境下,大家應(yīng)該都用過緩存,緩存都是放在內(nèi)存中的,而內(nèi)存幾乎是計(jì)算機(jī)中最寶貴也是最稀缺的資源,所以需要謹(jǐn)慎的使用,不然很容易就出現(xiàn) OOM。
緩存的主要作用是為了更快的處理業(yè)務(wù)、降低服務(wù)器的壓力,那么就要保證緩存命中率,這里假設(shè)整個(gè)緩存是一個(gè) key-value 結(jié)構(gòu)的(以鍵值對(duì)緩存為例),HashMap 作為強(qiáng)引用對(duì)象在沒有主動(dòng)將 key 刪除時(shí)是不會(huì)被 JVM 回收的,這樣 HashMap 中的對(duì)象就會(huì)越積越多直到 OOM 錯(cuò)誤;
那么如何做到既讓緩存的命中率高又不占用那么多的內(nèi)存,這里就可以采用 WeakHashMap,當(dāng)然不會(huì)有 HashMap 100% 的命中率(假設(shè)內(nèi)存足夠),但是在保證程序正常的前提下更好的實(shí)現(xiàn)了緩存這套解決方案。
WeakHashMap 內(nèi)部是通過弱引用來管理 Entry 的,弱引用的特性對(duì)應(yīng)到 WeakHashMap 上意味著什么呢?
將一對(duì) key-value 放入到 WeakHashMap 里并不能避免該 key 值被 GC 回收(除非在 WeakHashMap 之外還有對(duì)該 key 的強(qiáng)引用),故內(nèi)存問題也可以解決。
到此這篇關(guān)于Java中的WeakHashMap簡析的文章就介紹到這了,更多相關(guān)Java的WeakHashMap內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springmvc處理模型數(shù)據(jù)Map過程解析
這篇文章主要介紹了springmvc處理模型數(shù)據(jù)Map過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
java8中定時(shí)任務(wù)最佳實(shí)現(xiàn)方式(實(shí)現(xiàn)原理)
這篇文章主要介紹了java8中定時(shí)任務(wù)最佳實(shí)現(xiàn)方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-12-12

