SoftReference和WeakReference
?Java2增強(qiáng)了內(nèi)存管理功能, 增加了一個(gè)java.lang.ref包,其中定義了三種引用類。這三種引用類分別為SoftReference、WeakReference和PhantomReference.通過(guò)使用這些引用類,程序員可以在一定程度與GC進(jìn)行交互,以便改善GC的工作效率。這些引用類的引用強(qiáng)度介于可達(dá)對(duì)象和不可達(dá)對(duì)象之間。?
?
創(chuàng)建一個(gè)引用對(duì)象也非常容易,例如如果你需要?jiǎng)?chuàng)建一個(gè)Soft Reference對(duì)象,那么首先創(chuàng)建一個(gè)對(duì)象,并采用普通引用方式(可達(dá)對(duì)象);然后再創(chuàng)建一個(gè)SoftReference引用該對(duì)象;最后將普通引用設(shè)置為null.通過(guò)這種方式,這個(gè)對(duì)象就只有一個(gè)Soft Reference引用。同時(shí),我們稱這個(gè)對(duì)象為Soft Reference 對(duì)象。?
?
Soft Reference的主要特點(diǎn)是據(jù)有較強(qiáng)的引用功能。只有當(dāng)內(nèi)存不夠的時(shí)候,才進(jìn)行回收這類內(nèi)存,因此在內(nèi)存足夠的時(shí)候,它們通常不被回收。另外,這些引用對(duì)象還能保證在Java拋出OutOfMemory 異常之前,被設(shè)置為null.它可以用于實(shí)現(xiàn)一些常用圖片的緩存,實(shí)現(xiàn)Cache的功能,保證最大限度的使用內(nèi)存而不引起OutOfMemory.以下給出這種引用類型的使用偽代碼;?
?
//申請(qǐng)一個(gè)圖像對(duì)象?
Image p_w_picpath=new Image();//創(chuàng)建Image對(duì)象?
…?
//使用 p_w_picpath?
…?
//使用完了p_w_picpath,將它設(shè)置為soft 引用類型,并且釋放強(qiáng)引用;?
SoftReference sr=new SoftReference(p_w_picpath);?
p_w_picpath=null;?
…?
//下次使用時(shí)?
if (sr!=null) p_w_picpath=sr.get();?
else{?
//由于GC由于低內(nèi)存,已釋放p_w_picpath,因此需要重新裝載;?
p_w_picpath=new Image();?
sr=new SoftReference(p_w_picpath);?
}?
?
??? Weak引用對(duì)象與Soft引用對(duì)象的最大不同就在于:GC在進(jìn)行回收時(shí),需要通過(guò)算法檢查是否回收Soft引用對(duì)象,而對(duì)于Weak引用對(duì)象,GC總是進(jìn)行回收。Weak引用對(duì)象更容易、更快被GC回收。雖然,GC在運(yùn)行時(shí)一定回收Weak對(duì)象,但是復(fù)雜關(guān)系的Weak對(duì)象群常常需要好幾次GC的運(yùn)行才能完成。Weak引用對(duì)象常常用于Map結(jié)構(gòu)中,引用數(shù)據(jù)量較大的對(duì)象,一旦該對(duì)象的強(qiáng)引用為null時(shí),GC能夠快速地回收該對(duì)象空間。?
轉(zhuǎn)載于:https://blog.51cto.com/jianshusoft/695169
總結(jié)
以上是生活随笔為你收集整理的SoftReference和WeakReference的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: sql plus能登录 plsqldev
- 下一篇: 一套PumpLinx泵阀仿真分析攻略