Java中的WeakHashMap概念原理以及簡(jiǎn)單案例
WeakHashMap 概念和原理說(shuō)明
WeakHashMap使用了軟引用結(jié)構(gòu),它的對(duì)象在垃圾回收時(shí)會(huì)被刪除
注:垃圾回收是優(yōu)先級(jí)非常低的線程,不能被顯示調(diào)用,當(dāng)內(nèi)存不足的時(shí)候會(huì)啟用
下面是 WeakHashMap 的實(shí)現(xiàn)原理拆分:
public class WeakHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V> {
... ...
// 用于存儲(chǔ)需要清理的引用對(duì)象
private final ReferenceQueue<Object> queue = new ReferenceQueue<>();
... ...
// 內(nèi)部Entry繼承自WeakReference,從而有弱引用特性
private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V> {
... ...
}
... ...
// 用于移除內(nèi)部不用的Entry來(lái)釋放內(nèi)存
private void expungeStaleEntries() { ... ... }
... ...
}WeakHashMap 原理說(shuō)明
1.每次GC清理對(duì)象后,引用對(duì)象被放置到 ReferenceQueue 之中
2.每次訪問(wèn) WeakHashMap 都會(huì)調(diào)用 expungeStaleEntries 遍歷刪除 ReferenceQueue 中引用對(duì)象
使用案例
1、緩存中使用
由于 WeakHashMap 是弱引用,因此適合在緩存中使用,當(dāng)內(nèi)存不足GC的時(shí)候,會(huì)清理不用的引用達(dá)到釋放內(nèi)存的目的

2、不要使用基礎(chǔ)類(lèi)型作為WeakHashMap的key
我大概理解的是,基礎(chǔ)類(lèi)型的一定范圍不會(huì)被回收 原文:objectMap.put方法執(zhí)行的時(shí)候i會(huì)被封裝為Integer類(lèi)型的,Integer保留了-128到127的緩存。
但是對(duì)于int來(lái)說(shuō)范圍大很多,因此那些Key <= 127的Entry將不會(huì)進(jìn)行自動(dòng)回收,但是那些大于127的將會(huì)被回收,因此最后的尺寸總是會(huì)穩(wěn)定在128左右

到此這篇關(guān)于Java中的WeakHashMap概念原理以及簡(jiǎn)單案例的文章就介紹到這了,更多相關(guān)Java中的WeakHashMap內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA 格式化JSON數(shù)據(jù)并保存到j(luò)son文件中的實(shí)例
這篇文章主要介紹了JAVA 格式化JSON數(shù)據(jù)并保存到j(luò)son文件中的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
透徹理解Java中Synchronized(對(duì)象鎖)和Static Synchronized(類(lèi)鎖)的區(qū)別
這篇文章主要介紹了Java中Synchronized(對(duì)象鎖)和Static Synchronized(類(lèi)鎖)的區(qū)別,希望對(duì)大家有所幫助,一起跟隨小編過(guò)來(lái)看看吧2018-05-05
使用 Java 將 byte[] 轉(zhuǎn)換為 File 對(duì)象并上
本文展示了如何通過(guò) Java 和 Spring 來(lái)處理圖像文件的獲取、保存和上傳,通過(guò) RestTemplate 獲取字節(jié)數(shù)組并將其轉(zhuǎn)換為 File 對(duì)象,可以輕松實(shí)現(xiàn)從遠(yuǎn)程 URL 獲取文件并將其上傳到外部服務(wù)器,感興趣的朋友一起看看吧2025-03-03
Java實(shí)現(xiàn)WORD和PDF互相轉(zhuǎn)換以及數(shù)據(jù)填充示例
本文介紹了如何使用Java實(shí)現(xiàn)WORD和PDF的互轉(zhuǎn)以及數(shù)據(jù)填充功能,通過(guò)導(dǎo)入Aspose庫(kù)并使用其工具類(lèi),可以輕松實(shí)現(xiàn)WORD和PDF模板的填充和轉(zhuǎn)換,需要的朋友可以參考下2025-02-02
使用try-with-resource的輸入輸出流自動(dòng)關(guān)閉
這篇文章主要介紹了使用try-with-resource的輸入輸出流自動(dòng)關(guān)閉方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
SpringBoot項(xiàng)目集成Flyway進(jìn)行數(shù)據(jù)庫(kù)版本控制的詳細(xì)教程
這篇文章主要介紹了SpringBoot項(xiàng)目集成Flyway進(jìn)行數(shù)據(jù)庫(kù)版本控制,本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Spring?Cloud微服務(wù)架構(gòu)Sentinel數(shù)據(jù)雙向同步
這篇文章主要為大家介紹了Spring?Cloud微服務(wù)架構(gòu)Sentinel數(shù)據(jù)雙向同步示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10

