Posted on 2008-03-13 21:26
bluoy 閱讀(347)
評論(0) 編輯 收藏
.NET垃圾收集器的過去、現在和未來(一)
Patrick Dussud介紹:
Patrick Dussud在微軟工作了11年,曾經負責VBA、Jscript、MS Java等語言運行時的垃圾收集器(Garbage Collector)的設計,目前負責.NET CLR垃圾收集器的設計。他是.NET CLR的架構師,WinFX的首席架構師,Windows架構師組的成員。
在微軟之前,Patrick是德州儀器(TI)Explorer工作站系統的主要設計人,Lucid公司Energize產品的首席架構師。
關鍵內容摘要
1. 微管理 / 內存的顯式管理 --- 手動內存管理(new/delete)
你必須保證在釋放之前內存沒有被別人使用,如果你把內存給了別人,往往你就不確定應該何時釋放內存了。當你釋放了內存,不知道別人正在使用這塊內存時,就產生了程序崩潰的問題。所以,當你顯式進行“new”和“delete”時,內存管理是一個復雜的問題,并且,此時你的代碼不可組合。要么你必須確定對自己的內存有完全的控制,因此,要達到這種完全隔離的目的,你必須在將內存傳遞給別的模塊時進行完全拷貝,這樣,別的模塊就只對這個完全拷貝的內存負責。要么你就得在某個地方形成對整個內存池的統一的管理,這就是自動化內存管理,這就是垃圾收集器的工作。
2. 對象終止器的調用時機由垃圾收集器決定,這些對象的析構函數被調用的先后順序是無法預先確定的。提出了“關鍵終止化對象”的概念。當有一系列對象需要終止化時,關鍵終止化對象最后被終止化,直到上層對象干完工作前。
3. 工作機理: 垃圾收集器首先遍歷所有的棧和靜態變量,然后返回最初的樹集。然后遍歷樹集對程序能夠到達的每一個對象作標記。此時,我們就能逐個對象地檢查內存,發現它被標記了,好的,留下。沒有被標記?喔,我們有一個垃圾了。
4. 垃圾收集器的絕大部分速度和效率都來源于對回收策略的調整。通過保持內存緊湊,形成緩存本地化,頁面本地化等等優勢,很可能其效率甚至高于傳統“new”和“delete” 操作,尤其是對于非常難以管理的服務器內存來說更是如此。