我們都知道Java中內(nèi)存是通過(guò)GC自動(dòng)管理的,GC會(huì)在程序運(yùn)行過(guò)程中自動(dòng)判斷哪些對(duì)象是可以被回收的,并在合適的時(shí)機(jī)進(jìn)行內(nèi)存釋放。GC判斷某個(gè)對(duì)象是否可被回收的依據(jù)是,是否有有效的引用指向該對(duì)象。
如果沒有有效引用指向該對(duì)象(基本意味著不存在訪問(wèn)該對(duì)象的方式),那么該對(duì)象就是可回收的。這里的有效引用 并不包括弱引用。也就是說(shuō),雖然弱引用可以用來(lái)訪問(wèn)對(duì)象,但進(jìn)行垃圾回收時(shí)弱引用并不會(huì)被考慮在內(nèi),僅有弱引用指向的對(duì)象仍然會(huì)被GC回收。
WeakHashMap 內(nèi)部是通過(guò)弱引用來(lái)管理entry的,弱引用的特性對(duì)應(yīng)到 WeakHashMap 上意味著什么呢?
WeakHashMap 里的entry可能會(huì)被GC自動(dòng)刪除,即使程序員沒有調(diào)用remove()或者clear()方法。
WeakHashMap 的這個(gè)特點(diǎn)特別適用于需要緩存的場(chǎng)景。在緩存場(chǎng)景下,由于內(nèi)存是有限的,不能緩存所有對(duì)象;對(duì)象緩存命中可以提高系統(tǒng)效率,但緩存MISS也不會(huì)造成錯(cuò)誤,因?yàn)榭梢酝ㄟ^(guò)計(jì)算重新得到。