程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 《C#妹妹和Objective-C阿姨對話錄》(05)自動釋放池--拆遷隊的外援

《C#妹妹和Objective-C阿姨對話錄》(05)自動釋放池--拆遷隊的外援

編輯:關於C語言

C#妹妹:內存的清理跟生活中的拆遷一樣是個麻煩事情啊

Objective-C阿姨:是啊,該拆的不拆,占用空間,不該拆的拆了,程序崩潰

C#妹妹:說白了,難度不在拆上,在判定上,判斷到底那些內存是用不上的。

Objective-C阿姨:沒錯,就像現實生活中的拆遷,扒房子不困難,推土機過來就好了,困難的是決定扒誰的房子。。。扒對了相安無事,扒錯了弄個自焚的出來⋯⋯

C#妹妹:做個廣告,.NET的垃圾回收機制是相當不錯的。判斷很准確~

Objective-C阿姨:沒錯,但是也要付出代價,依靠運行時檢查廢棄的對象,就好像依靠人口普查來確定那些房子沒人用,是靠定時遍歷來實現的,畢竟影響性能,並且回收也不可能那麼及時。

C#妹妹:是的,垃圾回收其實是兩部分工作,一個是“檢查”,一個是“回收”,“檢查”就是找到那些沒人用的房子,在牆上寫一個大大的被圓圈圈起來的“拆”字。“回收”就是把標有“拆”字的房子推平,並且把還在用的房子集中在一起,避免形成碎片。還有很重要的一點是,回收過程中程序是暫停狀態的。

Objective-C阿姨:寫拆字的國際慣例也符合啊?~整個過程好像很漫長,性能如何保證呢?

C#妹妹:.NET的運行時為了提高效率采取了很多方法。

首先它優先普查人口流動比較大的地區,人口流動大,意味著房子閒置的可能性比較大。這個主要通過代齡來優化的,對象占用的空間,每經過一次垃圾回收器的掃描,而沒有被清理掉,代齡就加1。比如你04年買的房子,這時代齡為0,06年人口普查發現這套在用,代齡就變成1,08年人口普查有可能就不再檢查這套房子了,因為你已經起碼住了2年多了,搬家的可能性小些,垃圾回收器會重點檢查上次人口普查之後新入住的那些房子。當然清理了0代的房子後,還沒有足夠的空間,垃圾回收器還會去檢查1代甚至2代的房子的。

Objective-C阿姨:這就是歧視啊,怪不得我在上海買了房子也沒戶口,原來我是0代⋯⋯

C#妹妹:沒法子啊,誰讓效率優先呢?誰會在乎我們小百姓的公平~垃圾回收器第二個提高效率的方法是減少普查的次數,除非程序占用的內存超過規定,或者系統本身內存不富裕,不會輕易去搞內存普查這些爛事的。你以為垃圾回收器沒事干就一直掃描啊,他們也是想多歇歇呢~

Objective-C阿姨:.NET垃圾回收也有這麼多內幕啊

C#妹妹:小聲點,你不想想,這年頭沒點內幕誰去拆遷啊?Objective-C阿姨,你的對象管理就沒有內幕?

Objective-C阿姨:嗯,有,不過相對比較河蟹~因為有那麼點選擇的余地,上次不是說過了html" target=_blank>通過“Retain、Release”統計對象的引用數量來判斷對象是否可以回收,這種方法專業一點的名字叫“引用計數(reference counting)技術”。今天我繼續往後講“自動釋放(Auto Release)技術”。

C#妹妹:自動釋放?聽起來好像蠻先進的,是不是跟我的垃圾回收差不多。

Objective-C阿姨:差的多,它的本質還是引用計數,其實並不自動化,只是簡化了邏輯和代碼而已。算是個外援吧,還拿那個悲劇的House類做個實驗吧

view sourceprint? 01 <SPAN style="FONT-SIZE: 16px">#import "House.h" 02 //先建一個需要被刪除的對象 House類 03 @implementation House 04 -(void) dealloc//Objective-C在銷毀對象的時候會自動調用這個方法 05 { 06     NSLog(@"房子被拆除了"); 07     [super dealloc]; 08 } 09 @end 10 </SPAN>

Objective-C阿姨:這個倒霉House類,只重載了dealloc這個方法,忘記了麼?就是拆房子的時候會調用這個方法。接下來執行

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved