1.強(qiáng)引用
我們實(shí)例化一個(gè)對(duì)象洛波,直接引用了這個(gè)對(duì)象就是強(qiáng)引用。在這個(gè)對(duì)象被強(qiáng)引用的時(shí)骚露,GC無法回收這個(gè)對(duì)象蹬挤。
只有當(dāng)該對(duì)象所有的強(qiáng)引用都失去的時(shí)候,GC才會(huì)回收該對(duì)象棘幸。
2.弱引用
弱引用可以讓您保持對(duì)對(duì)象的引用焰扳,同時(shí)允許GC在必要時(shí)釋放對(duì)象,回收內(nèi)存误续。
一般使用場(chǎng)景:對(duì)象過大吨悍,并且不經(jīng)常訪問。這樣我們就可以創(chuàng)建一個(gè)弱引用蹋嵌,當(dāng)不常用該對(duì)象的時(shí)候育瓜,GC可以回收該對(duì)象,當(dāng)需要引用對(duì)象栽烂,可以先判斷弱引用的對(duì)象是不是存在躏仇,如果存在,就直接使用腺办,如果弱引用的對(duì)象已經(jīng)被回收焰手,那就重新創(chuàng)建一個(gè)對(duì)象來使用。
3.WeakReference
C#中采用WeakReference來創(chuàng)建弱引用怀喉。直接演示一個(gè)代碼:
//實(shí)例化弱引用傳遞一個(gè)對(duì)象
WeakReference wk = new WeakReference(person);
Person p1;
if (wk.IsAlive) //如果person沒有被回收
{
p1 = wk.Target as Person; //直接引用原對(duì)象
}
else //如果person已經(jīng)被回收了 重新創(chuàng)建一個(gè)對(duì)象
{
p1 = new Person() { Id = 1, Name = "demo" };
}
4.總結(jié)
弱引用運(yùn)行創(chuàng)建和使用對(duì)象书妻,但是垃圾回收器運(yùn)行時(shí),就會(huì)回收對(duì)象釋放內(nèi)存躬拢。但始終存在這樣的風(fēng)險(xiǎn):垃圾回收器在重新建立強(qiáng)引用之前先處理該對(duì)象驻子。但是在特定的情況下使用弱引用是很合理的。
使用 WeakReference類創(chuàng)建弱引用估灿。因?yàn)閷?duì)象可能在任意時(shí)刻被回收崇呵,所以在引用前必須確認(rèn)它存在。