引用計數

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

引用計數(英語:reference countingRC)是計算機編程語言中的一種內存管理技術,是指將資源(可以是對象內存磁盤空間等等)的被引用次數保存起來,當被引用次數變為零時就將其釋放的過程。使用引用計數技術可以實現自動資源管理的目的。同時引用計數還可以指使用引用計數技術回收未使用資源的垃圾回收算法。

當創建一個對象的實例並在堆上申請內存時,對象的引用計數就為1,在其他對象中需要持有這個對象時,就需要把該對象的引用計數加1,需要釋放一個對象時,就將該對象的引用計數減1,直至對象的引用計數為0,對象的內存會被立刻釋放。

使用這種方式進行內存管理的語言:Objective-CPythonVala等。

優勢與缺陷[編輯]

跟蹤式垃圾回收相比,引用計數的主要優點是可以儘快地回收不再被使用的對象,同時在回收過程中不會導致長時間的停頓,還可以清晰地標明每一個對象的生存周期。

實時應用或內存受限的系統中,實時響應能力是一項重要指標,而引用計數作為最容易實現的垃圾回收技術之一,很適合於這種情況。引用計數還可以用於管理其他非內存資源,如操作系統對象(經常比內存資源更稀缺)。跟蹤式垃圾回收技術用終結器處理此類目標,但延遲回收可能引發其他問題。加權引用計數是適用於分布式系統的派生技術。

在可用內存被活躍對象填滿的平台上,跟蹤式垃圾回收會被頻繁觸發,從而降低性能。而引用計數即便在內存瀕臨耗盡的情況下性能依然有所保障。[1]引用計數還能為其他運行時優化技術提供參考信息,例如對於許多使用不可變對象的系統來說(如函數式編程語言),大量複製對象導致的性能懲罰有時十分嚴重;在此類系統上一個典型的優化措施是:假如一個對象被創建以後僅使用了一次,且在其不再被引用的同時另一個類似的對象被創建出來(如Javascript中的字符串拼接賦值操作),可以將刪除原對象創建新對象的行為變為修改原對象,從而提高效率。引用計數可以為這類優化提供充分的參考信息。

未經優化的引用計數相比跟蹤式垃圾回收有兩個主要缺點,都需要引入附加機制予以修復:

  • 頻繁更新引用計數會降低運行效率。
    • 對於Vala等在編譯時進行引用計數的語言一般較少存在這一問題[2]
  • 原始的引用計數無法解決循環引用問題。

另外,如果使用空閒列表分配內存,那麼引用計數的空間局域性非常差。僅使用引用計數無法通過移動對象來提高CPU緩存的性能,所以高性能的內存分配器都會同時實現一個跟蹤式垃圾回收器以提高性能。許多引用計數實現(比如PHP和Objective-C)的性能不佳都是因為沒有實現內存拷貝。[3]

Objective-C 範例[編輯]

NSObject* obj = [[NSObject alloc] init];  //obj retain count is 1
obj = [obj1 retain];  //obj retain count is 2
[obj release];  //obj retain count is 1
[obj release];  //obj retain count is 0, obj was released

相關條目[編輯]

參考資料[編輯]

  1. ^ Wilson, Paul R. "Uniprocessor Garbage Collection Techniques". Proceedings of the International Workshop on Memory Management. London, UK: Springer-Verlag. pp. 1–42. ISBN 3-540-55940-X. Retrieved 5 December 2009. Section 2.1.
  2. ^ Projects/Vala/ReferenceHandling - GNOME Wiki!. wiki.gnome.org. [2022-10-07]. (原始內容存檔於2022-05-05). 
  3. ^ Rifat Shahriyar, Stephen M. Blackburn, Xi Yang and Kathryn S. McKinley (2013). "Taking Off the Gloves with Reference Counting Immix". 24th ACM SIGPLAN conference on Object Oriented Programming Systems, Languages and Applications. OOPSLA 2013. doi:10.1145/2509136.2509527.