青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

coreBugZJ

此 blog 已棄。

垃圾回收與弱引用 (轉)

在一個允許在堆上動態分配內存空間并且采取隱式內存釋放的程序設計語言里,如何確保內存的正確釋放不再是程序員的關注點,而由運行時環境來提供支持。無法被程序引用的在堆上已分配的內存空間成為垃圾(無用內存單元)。運行時環境要清除垃圾有兩種方式:比較積極的方式,引用計數;與比較懶惰的方式,垃圾回收。


引用計數方式會為每個已分配內存單元設置計數器,當計數器減少到0的時候就意味著該單元無法再被引用,于是立即執行釋放內存的動作。垃圾回收方式的基本思想是mark-and-sweep(標記-清除),每隔一段時間或者在堆空間不足的時候才進行一次垃圾回收,每次垃圾回收先將所有堆上分配的內存單元標記為“不可到達”,然后從一組根引用開始掃描,把所有從根引用出發可以達到的單元標記為“可以到達”;然后把標記為“不可到達”的內存單元回收到可用的堆空間中。


這兩種清除垃圾的方式的特點很不一樣。


其中,引用計數方式有四個主要問題:
1、如果分配的內存單元本身比較小,則用于計數的計數器所占的空間就會變得明顯(significant),而垃圾回收方式只需要為每個分配的內存單元設置一個比特位的標記;
2、維護計數器的狀態需要消耗時間。每當一個指針或者引用被賦值的時候,計數器的狀態都要跟著改變。像LISP這樣的語言,幾乎所有操作都涉及改變指針(因為要操縱鏈表),計數器的狀態維護會占據整個程序執行時間中明顯的部分。這并不像MSDN Channel 9上Stephan T. Lavavej對C++ TR1中的介紹中所說的“shared_ptr沒有垃圾回收所帶來的額外時間消耗”,引用計數只不過是把這種消耗平均的分攤到了程序運行的整個過程中而已;
3、計數器相關的代碼可能會分布在運行時系統,甚至用戶代碼的各處,不便于代碼的維護;
4、當存在循環引用時,內存的正確釋放會比較復雜。當然并不是不可解決,下文會再提到。


標記-清除式的垃圾回收則有另外的一些問題:
1、標記-清除會不定時的產生運算資源消耗的高峰(spike)。在沒有進行垃圾回收的時候,程序可以運行得比較順暢,但在執行垃圾回收的時候一般需要把整個程序停下來并執行標記-清除的過程,除非使用并行回收機制。標記的過程可能很長并且很消耗資源,如果是實時系統則一般無法承受這種消耗高峰而寧可使用引用計數方式將消耗分攤到程序的整個運行過程上。分代式的垃圾回收在一定程度上緩解了這個問題,但并沒有根除消耗高峰的問題;
2、當你最需要垃圾回收器工作的時候,它的運行效果卻最差。最需要進行垃圾回收的時候顯然是堆上的內存已經快分配盡了的時候,但此時已分配的內存單元很多,需要使用大量時間來做標記,但實際能釋放的內存單元卻未必很多。
3、標記-清除算法有兩種實現思路,一是“保守式”(conservative),二是“準確式”(exact)。保守式不需要知道內存的具體布局形式,會把棧上和全局區上所有“看起來像指針”的數值看作指針并納入標記計算中;準確式則要求運行時系統清楚的了解內存布局形式,能夠分辨哪些數據是指針哪些不是,并且只將指針納入標記計算中。前者未必能保證內存的準確釋放(但能夠保證正在被引用的內存不被釋放),后者則相對需要消耗更多的內存和更多的時間。
有名的Boehm GC就是保守式的代表。去年開源了的Adobe Virtual Machine 2(AVM2,又稱Tamarin)中的MMgc也是保守式的。未換用Tamarin之前的SpiderMonkey則使用了準確式的垃圾回收。

 
=========================================================================================

 
當代許多程序設計語言的運行時系統都采用了隱式內存釋放的設計,并出于各自的設計目標選用了不同的清除垃圾的方法。


在許多采用引用計數方式實現垃圾清除的系統中都有所謂的弱引用,例如說Squirrel,為的是解決循環引用的問題。讓我們來看看Squirrel 2.2參考手冊里的一段描述:


引用

Weak References

The weak references allows the programmers to create references to objects without influencing the lifetime of the object itself. In squirrel Weak references are first-class objects created through the built-in method obj.weakref(). All types except null implement the weakref() method; however in bools, integers and float the method simply returns the object itself(this because this types are always passed by value). When a weak references is assigned to a container (table slot, array, class or instance) is treated differently than other objects; When a container slot that hold a weak reference is fetched, it always returns the value pointed by the weak reference instead of the weak reference object. This allow the programmer to ignore the fact that the value handled is weak. When the object pointed by weak reference is destroyed, the weak reference is automatically set to null.


換句話說,如果我們預先知道可能出現循環引用狀況,而其中一些引用并不需要那么“強”,那么我們就可以使用弱引用來消除循環引用的問題。在這個語境下,弱引用就是不會影響計數器狀態的引用。這意味著即使我們擁有對某個對象的弱引用也不會阻止它被清除;也就是說,我們并不能知道手上的弱引用是否指向一個有效的對象。一般弱引用的實現都會保證當某個弱引用指向的不是有效對象時它會被設置為空值,例如null、nil、Nothing之類。


有人為Visual Basic 5/6也提出了弱引用的實現方法:Avoiding Circular References: WeakReference in VB-Classic。


微軟的Component Object Model(COM)可以說是應用的最廣泛的采用引用計數式垃圾清除的系統吧,但它的IUnknown.AddRef和IUnknown.Release方法沒少給程序員帶來頭疼,而且也沒提供解決統一的循環引用檢測機制。即便如此現在還是有很多大型系統運行于其上,而且看起來好好的(搖頭
 不,不都是好好的。想想IE的內存泄漏問題吧。在IE里用JScript想要造成內存泄漏還是挺簡單的,不知道怎么做的話搜一下吧。^ ^

吉里吉里2也采用了引用計數方式的垃圾清除,但為了保證垃圾的清除,特別是引用的循環和程序結束時的資源釋放,做了許多特別措施。這個另外在找時間寫。


=========================================================================================

 
如上文所述,在引用計數環境中使用弱引用主要是為了解決循環引用帶來的問題。而標記-清除方式的垃圾回收并不會受循環引用的影響:假如一組對象相互存在引用,而從根引用組出發已經無法達到它們之中的任何一個,則它們仍然會被回收。


但是許多采取標記-清除方式垃圾回收的環境也提供了弱引用。為什么呢?


首先想到的,弱引用肯定是為了解決問題而存在的;也就是說垃圾回收還是有問題,無法根除內存泄漏的問題。


在這種環境下的內存泄漏經常是人為失誤造成的:無意的長時間持有了對已經不需要的對象的引用。這種引用經常存在于生命期特別長的對象中,例如一些全局對象中;Java和C#等語言雖然不允許在類之外定義全局數據,但類變量(而不是成員變量)或者諸如singleton等的特例的表現與C/C++中的全局變量并沒有什么區別。

 
為了解決這樣的問題,像Java和.NET Framework這樣的平臺也提供了弱引用機制。與引用計數環境一樣,弱引用也不影響判定某個內存單元是否為垃圾的標記計算。

 
在Java中有三種“弱”引用:java.lang.ref.WeakReference<T>、java.lang.ref.SoftReference<T>、java.lang.ref.PhantomReference<T>。
 .NET Framework中也有System.WeakReference。


下面幾篇文章對它們分別做了介紹:


Java theory and practice: Plugging memory leaks with weak references
Understanding Weak References
C# WeakReference Example


=========================================================================================

 
參考


Concepts of Programming Languages, Seventh Edition, Heap Management, Pages 301-305, by Robert W. Sebesta。

P.S. 上文把"reference counting"與"garbage collection"(GC)放在了同一層次來討論,但GC的定義在許多資料中都不一樣。我個人的看法是"reference counting"只是與"mark-and-sweep"一樣,屬于GC的一種策略;GC這個概念應該比reference counting和mark-and-sweep的層次更抽象才對。不過由于本文參考的資料里是按照"reference counting"和"garbage collection"來區分的,這里也就沿用了。

posted on 2012-03-17 15:26 coreBugZJ 閱讀(664) 評論(0)  編輯 收藏 引用 所屬分類: ProgrammingLanguage

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲免费在线电影| 久久精品在线| 久久视频一区二区| 久久婷婷国产麻豆91天堂| 国产精品一区二区三区四区五区| 一本一本久久a久久精品综合妖精| 99视频精品全国免费| 欧美日韩国产综合视频在线观看| 亚洲人成网在线播放| 亚洲影院免费观看| 久久久久www| 亚洲二区在线观看| 欧美精品麻豆| 亚洲男人天堂2024| 午夜宅男久久久| 亚洲国产精品久久久久久女王| 亚洲人成艺术| 欧美视频在线不卡| 久久精品一区蜜桃臀影院| 久久久久久久尹人综合网亚洲| 最新国产拍偷乱拍精品| 久久久精品久久久久| 麻豆精品视频在线观看| 亚洲免费在线视频| 亚洲全部视频| 亚洲免费一级电影| 久久综合福利| 99v久久综合狠狠综合久久| 亚洲欧美高清| 免费看的黄色欧美网站| 欧美一区二区三区的| 亚洲精品一区二区在线观看| 久久综合影视| 欧美一区二区视频观看视频| 日韩一级黄色av| 亚洲精品免费在线观看| 亚洲一区二区三区高清不卡| 欧美一区二区三区日韩| 欧美精品二区三区四区免费看视频| 国产精品成人免费| 欧美日韩三级一区二区| 欧美黄免费看| 欧美日韩视频一区二区| 国内一区二区三区在线视频| 国产精品日韩| 国产伦精品一区二区| 91久久精品一区二区三区| 香蕉久久夜色精品国产| 欧美呦呦网站| 99视频精品免费观看| 另类尿喷潮videofree| 国产一区清纯| 狠狠色综合网站久久久久久久| 亚洲午夜三级在线| 亚洲精品麻豆| 一本色道久久综合精品竹菊| 久久综合中文字幕| 新67194成人永久网站| 国产精品户外野外| 亚洲视频在线免费观看| 亚洲小少妇裸体bbw| 欧美激情精品久久久久久免费印度| 久久久综合视频| 欧美肥婆在线| 日韩天堂在线视频| 欧美+日本+国产+在线a∨观看| 欧美成人精品三级在线观看| 欧美高清在线观看| 亚洲电影av在线| 99精品视频免费全部在线| 亚洲淫性视频| 久久一区二区三区av| 亚洲综合99| 国产亚洲欧美一区二区三区| 国产亚洲精品一区二区| 欧美一区二区三区成人| 亚洲欧美视频在线观看视频| 久久福利资源站| 蜜桃久久av| 欧美日韩无遮挡| 亚洲一区三区视频在线观看| 一区二区三区蜜桃网| 国产精品每日更新| 亚洲精品久久视频| 亚洲日韩视频| 欧美视频在线观看 亚洲欧| 亚洲视频一区二区| 欧美一区二区福利在线| 一区精品在线| 久久国产日本精品| 亚洲国产成人精品女人久久久 | 亚洲综合首页| 国产综合网站| 亚洲精品视频在线观看免费| 亚洲欧美在线aaa| 欧美一区二视频在线免费观看| 欧美三区视频| 午夜精品久久久久久久久| 午夜精品美女久久久久av福利| 99这里只有精品| 国产一区二区三区久久精品| 模特精品裸拍一区| 国产精品爽黄69| 一本一本久久| 日韩亚洲视频| 国产一区二区三区日韩| 亚洲国产精品第一区二区三区| 欧美国产第二页| 久久国产精品久久久久久久久久| 欧美bbbxxxxx| 久久久福利视频| 欧美日韩三级一区二区| 蜜桃av一区二区在线观看| 欧美婷婷久久| 亚洲福利久久| 国产一区二区毛片| 99国产精品| 亚洲日本欧美| 久久久久久午夜| 久久国产日韩| 国产精品一区二区在线观看网站| 亚洲国内精品在线| 在线播放日韩欧美| 乱人伦精品视频在线观看| 欧美美女bb生活片| 一区二区三区日韩精品| 亚洲日本va在线观看| 樱桃国产成人精品视频| 亚洲欧美日韩国产综合精品二区| 亚洲乱码国产乱码精品精天堂 | 亚洲一区二区三区四区在线观看| 在线观看视频日韩| 欧美一站二站| 亚洲大胆人体在线| 欧美一区二区在线播放| 午夜精品一区二区三区电影天堂| 欧美精品v日韩精品v国产精品| 久久一本综合频道| 一区在线观看| 久久夜色精品| 欧美高清视频| 亚洲黄色尤物视频| 99热免费精品| 一区二区三区免费网站| 欧美日韩另类一区| 99热精品在线| 性欧美长视频| 国产视频久久久久久久| 欧美激情导航| 亚洲欧洲日产国产综合网| 蜜臀av在线播放一区二区三区| 欧美不卡一区| 亚洲精品综合| 欧美视频精品一区| 亚洲制服av| 久久嫩草精品久久久久| 国产综合色一区二区三区| 久久精品首页| 亚洲国产一区二区在线| 在线一区二区三区做爰视频网站 | 久久精品国产精品 | 亚洲国产日韩欧美在线图片| 狂野欧美激情性xxxx| 亚洲国产片色| 国产精品扒开腿做爽爽爽软件| 精品盗摄一区二区三区| 久久精品72免费观看| 欧美国产一区二区在线观看| 亚洲破处大片| 国产精品欧美激情| 久久久久综合一区二区三区| 91久久久在线| 欧美在线精品一区| 欧美日韩一区二区三区免费看| 一区二区三区精密机械公司| 久久久久国产精品www| 亚洲人永久免费| 国产毛片精品视频| 美女福利精品视频| 亚洲午夜在线视频| 亚洲手机视频| 伊人久久亚洲影院| 欧美性感一类影片在线播放| 久久久精品动漫| 亚洲午夜激情免费视频| 美国成人直播| 亚洲欧美日韩一区在线| 亚洲成色www久久网站| 国产精品视频免费| 欧美电影免费观看| 久久精品在线播放| 亚洲欧美综合一区| 亚洲精品中文字幕在线观看| 久久在线免费| 午夜精品久久久久99热蜜桃导演| 亚洲美女在线一区| 亚洲国产精品va| 狠狠色狠色综合曰曰| 国产日本亚洲高清| 欧美一区免费视频|