Java中的WeakHashMap淺析
WeakHashMap介紹
- weakhashmap優(yōu)化jvm,是GC更加智能回收無用的對象。
- weakhashmap關(guān)鍵是:當(dāng)一個(gè)對象被GC回收時(shí),響應(yīng)的值對象的引用從map中刪除,weakhaskmap能節(jié)約存儲(chǔ)空間,來實(shí)現(xiàn)緩存那些非必要的數(shù)據(jù)
引用類型
java中提供的引用類型有4種
- 強(qiáng)(Strong)引用
- 軟(soft)引用
- 弱(weak)引用
- 虛( phantom)引用
強(qiáng)(Strong)引用
常使用的引用類型,在創(chuàng)建對象時(shí)

只要強(qiáng)引用存在,GC永遠(yuǎn)不會(huì)回收被引用的對象,通過new創(chuàng)建的對象所關(guān)聯(lián)引用就是強(qiáng)引用,此時(shí)GC就不會(huì)碰該對象,當(dāng)jvm內(nèi)存空間不足,jvm寧愿拋出OOM(OutOfMemoryError)運(yùn)行時(shí)村務(wù),使得程序終止,也不會(huì)隨時(shí)回收強(qiáng)引用所引用的對象 java中除了強(qiáng)引用還有三種引用,在java.lang.ref.Reference

//referent為引用指向的對象
Reference(T referent) {
this(referent, null);
}
//ReferenceQueue對象,可以理解為隊(duì)列
Reference(T referent, ReferenceQueue<? super T> queue) {
this.referent = referent;
this.queue = (queue == null) ? ReferenceQueue.NULL : queue;
}Object o=new Object(); SoftReferencr sr=new SoftReference(o,queue);
sr為軟引用,指向O對象,o會(huì)在一定實(shí)際被垃圾回收器進(jìn)行回收,sr對象本身的清理依賴Queue,當(dāng)sr出現(xiàn)在Queue時(shí),說明指向?qū)ο笠呀?jīng)無效了,可以放心清理
軟(soft)引用
軟引用用來處理啊一些有用但非必須對象,對于軟引用所作用的對象,當(dāng)內(nèi)存空間充足時(shí),如果發(fā)生GC操作,軟引用所作用的對象是不會(huì)被回收的,當(dāng)空間 不足時(shí),GC操作時(shí)軟引用所作用的對象才會(huì)被回收
public static void softReferenceDemo(){<!--{C}%3C!%2D%2D%20%2D%2D%3E--> Object o = new Object(); ReferenceQueue <Object> referenceQueue = new ReferenceQueue <Object>(); SoftReference <Object> softReference = new SoftReference <Object>(o, referenceQueue); System.out.println(softReference.get()); System.out.println(softReference.isEnqueued()); System.out.println(referenceQueue.poll()); /** * java.lang.Object@4aa594e1 * false * null */ /** * 當(dāng)對象被回收時(shí),他會(huì)放入到referenceQueue實(shí)例中 */ //創(chuàng)建比較大的對象,模擬內(nèi)存不足,觸發(fā)GC,回收軟引用對象 byte[] bytes = new byte[7*1024*1024]; System.gc(); //手動(dòng)觸發(fā)GC /** * 理論上空間不足,對象會(huì)被回收,隊(duì)列中會(huì)有軟引用對象 */ System.out.println(softReference.get()); System.out.println(softReference.isEnqueued()); System.out.println(referenceQueue.poll()); /** * java.lang.Object@4aa594e1 false null 空間充足,未回收 */ } public static void softReferenceDemo(){
Object o = new Object();
ReferenceQueue <Object> referenceQueue = new ReferenceQueue <Object>();
SoftReference <Object> softReference = new SoftReference <Object>(o, referenceQueue);
System.out.println(softReference.get());
System.out.println(softReference.isEnqueued());
System.out.println(referenceQueue.poll());
/**
* java.lang.Object@4aa594e1
* false
* null
*/
/**
* 當(dāng)對象被回收時(shí),他會(huì)放入到referenceQueue實(shí)例中
*/
//創(chuàng)建比較大的對象,模擬內(nèi)存不足,觸發(fā)GC,回收軟引用對象
byte[] bytes = new byte[7*1024*1024];
System.gc(); //手動(dòng)觸發(fā)GC
/**
* 理論上空間不足,對象會(huì)被回收,隊(duì)列中會(huì)有軟引用對象
*/
System.out.println(softReference.get());
System.out.println(softReference.isEnqueued());
System.out.println(referenceQueue.poll());
/**
*
java.lang.Object@4aa594e1
false
null
空間充足,未回收
*/
}弱(weak)引用
弱引用他的強(qiáng)度會(huì)比軟引用更弱一些,被軟引用所關(guān)聯(lián)的對象,當(dāng)發(fā)生GC操作時(shí),無論當(dāng)前空間是否充足,都會(huì)回收軟引用所作用的對象,生命周期會(huì)更加短暫
public static void weakReferenceDemo(){
Object o = new Object();
ReferenceQueue <Object> referenceQueue = new ReferenceQueue <Object>();
WeakReference <Object> weakReference = new WeakReference<Object>(o, referenceQueue);
System.out.println(weakReference.get());
System.out.println(weakReference.isEnqueued());
System.out.println(referenceQueue.poll());
System.gc(); //手動(dòng)觸發(fā)GC
System.out.println(weakReference.get());
System.out.println(weakReference.isEnqueued());
System.out.println(referenceQueue.poll());
}weakHashMap實(shí)現(xiàn)就是基于弱來實(shí)現(xiàn)的
虛引用
虛引用是最弱的引用關(guān)系,一個(gè)對象是否有虛引用的存在,不會(huì)影響對象的聲明周期,虛引用存在的目的是當(dāng)對象被回收時(shí)收到一個(gè)系統(tǒng)通知
public static void phantomferenceDemo(){
Object o = new Object();
ReferenceQueue <Object> referenceQueue = new ReferenceQueue <Object>();
PhantomReference <Object> phantomReference = new PhantomReference<Object>(o, referenceQueue);
o = null;
System.gc(); //手動(dòng)觸發(fā)GC
if (phantomReference.isEnqueued()) {
System.out.println("正在被回收");
} else {
System.out.println("沒有被回收");
}
}到此這篇關(guān)于Java中的WeakHashMap淺析的文章就介紹到這了,更多相關(guān)Java的WeakHashMap內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring整合Mybatis具體代碼實(shí)現(xiàn)流程
這篇文章主要介紹了Spring整合Mybatis實(shí)操分享,文章首先通過介紹Mybatis的工作原理展開Spring整合Mybatis的詳細(xì)內(nèi)容,需要的小伙伴可以參考一下2022-05-05
Spring Security OAuth2 token權(quán)限隔離實(shí)例解析
這篇文章主要介紹了Spring Security OAuth2 token權(quán)限隔離實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
詳解Springboot應(yīng)用啟動(dòng)以及關(guān)閉時(shí)完成某些操作
這篇文章主要介紹了詳解Springboot應(yīng)用啟動(dòng)以及關(guān)閉時(shí)完成某些操作,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11
深入理解@component與@Configuration注解
這篇文章主要介紹了深入理解@component與@Configuration注解,從Spring3.0,@Configuration用于定義配置類,可替換xml配置文件,被注解的類內(nèi)部包含有一個(gè)或多個(gè)被@Bean注解的方法,這些方法將會(huì)被掃描,并用于構(gòu)建bean定義,初始化Spring容器,需要的朋友可以參考下2023-11-11
解決SpringBoot內(nèi)嵌Tomcat并發(fā)容量的問題
這篇文章主要介紹了解決SpringBoot內(nèi)嵌Tomcat并發(fā)容量的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

