直播中
大約40年前,John McCarthy設(shè)計(jì)了LISP語言,它是可考證的第一種編程語言。LISP運(yùn)行時(shí)不斷地分配和釋放大量的小塊內(nèi)存,由于那時(shí)的計(jì)算機(jī)內(nèi)存遠(yuǎn)遠(yuǎn)沒有現(xiàn)在這么龐大,因此早期的LISP用戶很快感到內(nèi)存不足,同時(shí)許多不再使用的內(nèi)存卻未能利用起來。為了解決這個(gè)問題,McCarthy于1959年第一次提出了垃圾回收的思想。
在一個(gè)真正面向?qū)ο蟮南到y(tǒng)中,垃圾回收機(jī)制能夠很好地滿足分配和釋放大量小塊內(nèi)存的需要。因此,Microsoft在VS.NET中重新實(shí)現(xiàn)了垃圾回收機(jī)制。
CLR垃圾回收器(CLR Garbage Collector)的主要任務(wù)就是監(jiān)視程序使用的資源,當(dāng)可用資源達(dá)到某個(gè)確定的極限時(shí)查找不再使用的對象,如發(fā)現(xiàn)有這類對象存在則釋放它們所占用的資源。垃圾回收的一個(gè)很大的優(yōu)點(diǎn)是程序員無需再為大多數(shù)常見的循環(huán)引用擔(dān)心。在循環(huán)引用情形下,子對象擁有對父對象的引用,同時(shí)父對象又擁有對子對象的引用。在引用計(jì)數(shù)模式下,循環(huán)引用阻止了系統(tǒng)釋放和拆除任意一個(gè)對象。然而,垃圾回收器能夠找出這類循環(huán)引用并拆除它們。垃圾回收機(jī)制同時(shí)也意味著,當(dāng)對象的最后一個(gè)引用被釋放時(shí),對象并不一定立即被拆除。
采用垃圾回收機(jī)制的一個(gè)后果是:我們不能再希望類的Terminate事件總是適時(shí)觸發(fā)。事實(shí)上,如果線程被阻塞的話,Terminate事件可能完全不會觸發(fā)。這就是所謂的“非確定的結(jié)束”(non-deterministic finalization),而COM提供的則是“確定的結(jié)束”。由于缺乏“確定的結(jié)束”,再加上因?yàn)槔厥掌髦匦陆M織和整理內(nèi)存導(dǎo)致不能運(yùn)用指針,新聞組中出現(xiàn)了對該問題激烈的爭論:有些人憎恨這些新的限制,因?yàn)樗麄円蕾囉凇按_定的結(jié)束”;有些人覺得無關(guān)緊要,因?yàn)樗麄儾⒉灰蕾囉赥erminate事件。
從引用計(jì)數(shù)轉(zhuǎn)變到垃圾回收僅僅是Visual Studio.NET底層體系不再是COM這一變化的諸多必然結(jié)果之一。雖然VB.NET之內(nèi)仍舊可以使用COM對象,但這些對象必須通過封裝(Wrapper)才能訪問。任何時(shí)候,封裝都意味著性能的降低,甚至還有可能導(dǎo)致對象行為的異常。如果要遷移一個(gè)大量使用COM對象的工程,你必須認(rèn)真地進(jìn)行計(jì)劃和測試,應(yīng)用程序的某些部分可能還需要重新構(gòu)造。