Java中的WeakHashMap簡(jiǎn)析
一、什么是 WeakHashMap
Map 的子類(lèi)常見(jiàn)的有 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ì)象,無(wú)論當(dāng)前內(nèi)存空間是否充足,都會(huì)將弱引用回收。
想象一下如下場(chǎng)景:
- 調(diào)用兩次 size():第一次為 10,第二次就為 8 了。
- 兩次調(diào)用 isEmpty():第一次返回 false,第二次返回 true。
- 兩次調(diào)用 containsKey():第一次返回 true,第二次返回 false。
- 兩次調(diào)用 get():第一次返回一個(gè) value,第二次返回 null。
三、使用場(chǎng)景
在如今的并發(fā)泛濫的大環(huán)境下,大家應(yīng)該都用過(guò)緩存,緩存都是放在內(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ì)象在沒(méi)有主動(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)部是通過(guò)弱引用來(lái)管理 Entry 的,弱引用的特性對(duì)應(yīng)到 WeakHashMap 上意味著什么呢?
將一對(duì) key-value 放入到 WeakHashMap 里并不能避免該 key 值被 GC 回收(除非在 WeakHashMap 之外還有對(duì)該 key 的強(qiáng)引用),故內(nèi)存問(wèn)題也可以解決。
到此這篇關(guān)于Java中的WeakHashMap簡(jiǎn)析的文章就介紹到這了,更多相關(guān)Java的WeakHashMap內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中的concurrenthashmap集合詳細(xì)剖析
這篇文章主要介紹了Java中的concurrenthashmap集合詳細(xì)剖析,有參構(gòu)造后第一次put時(shí)會(huì)進(jìn)行初始化,由源碼可知,會(huì)先判斷所傳入的容量是否>=最大容量的一半,如果滿(mǎn)足條件,就會(huì)將容量修改為最大值,反之則會(huì)將容量改為所傳入數(shù)*1.5+1,需要的朋友可以參考下2023-11-11關(guān)于break和continue以及l(fā)abel的區(qū)別和作用(詳解)
下面小編就為大家?guī)?lái)一篇關(guān)于break和continue以及l(fā)abel的區(qū)別和作用(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05Java中Spring MVC接收表單數(shù)據(jù)的常用方法
Spring MVC是Spring框架中的一個(gè)模塊,用于開(kāi)發(fā)基于MVC(Model-View-Controller)架構(gòu)的Web應(yīng)用程序,它提供了一種輕量級(jí)的、靈活的方式來(lái)構(gòu)建Web應(yīng)用,同時(shí)提供了豐富的功能和特性,本文給大家介紹了Spring MVC接收表單數(shù)據(jù)的方法,需要的朋友可以參考下2024-05-05Java如何將任意類(lèi)型的Object對(duì)象轉(zhuǎn)換為相應(yīng)的實(shí)體對(duì)象
這篇文章主要介紹了Java如何將任意類(lèi)型的Object對(duì)象轉(zhuǎn)換為相應(yīng)的實(shí)體對(duì)象問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01Java8 Stream對(duì)兩個(gè) List 遍歷匹配數(shù)據(jù)的優(yōu)化處理操作
這篇文章主要介紹了Java8 Stream對(duì)兩個(gè) List 遍歷匹配數(shù)據(jù)的優(yōu)化處理操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08idea快捷鍵生成getter和setter,有構(gòu)造參數(shù),無(wú)構(gòu)造參數(shù),重寫(xiě)toString方式
這篇文章主要介紹了java之idea快捷鍵生成getter和setter,有構(gòu)造參數(shù),無(wú)構(gòu)造參數(shù),重寫(xiě)toString方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11java中對(duì)Redis的緩存進(jìn)行操作的示例代碼
本篇文章主要介紹了java中對(duì)Redis的緩存進(jìn)行操作的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08項(xiàng)目為什么引入log4j而不是logback代碼
這篇文章主要介紹了項(xiàng)目為什么引入log4j而不是logback代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10