国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

javascript的垃圾回收機制和內存管理

googollee / 2740人閱讀

摘要:另一種垃圾收集算法是引用計數(shù),這種算法的思想是跟蹤記錄所有值被引用的次數(shù)。當代碼中存在循環(huán)引用現(xiàn)象時,引用計數(shù)算法就會導致問題。

垃圾回收

javascript不同于c、c++的一個特點是:具有自動的垃圾回收機制,這就意味著,開發(fā)人員可以專注于業(yè)務,而不必把過多精力放在內存的管理上,提高開發(fā)效率。
所謂的垃圾回收就是找出那些不再繼續(xù)使用的變量,然后釋放其占用的內存。為此,垃圾收集器會按照固定的時間間隔(或代碼執(zhí)行中預定的收集時間),周期性地執(zhí)行這一操作。
目前在瀏覽器中,實現(xiàn)垃圾回收的方式主要有兩種:
1.標記清除
也是javascript最常用的垃圾回收的方式。
在標記清除的方式中有兩個概念:『進入環(huán)境』和『離開環(huán)境』。『進入環(huán)境』指變量進入執(zhí)行的環(huán)境。『離開環(huán)境』指變量完成任務,離開了執(zhí)行的環(huán)境。
垃圾收集器在運行的時候會給存儲在內存中的所有變量都加上標記。然后,它會去掉環(huán)境中的變量以及被環(huán)境中的變量引用的變量的標記。而在此之后再被加上標記的變量將被視為準備刪除的變量,原因是環(huán)境中的變量已經(jīng)無法訪問到這些變量了。最后,垃圾收集器完成內存清除工作,銷毀那些帶標記的值并回收它們所占用的內存空間。
2.引用計數(shù)
引用計數(shù)的含義是跟蹤記錄每個值被引用的次數(shù)。當聲明了一個變量并將一個引用類型值賦給該變量時,則這個值的引用次數(shù)就是1。如果同一個值又被賦給另一個變量,則該值的引用次數(shù)加 1。相反,如果包含對這個值引用的變量又取得了另外一個值,則這個值的引用次數(shù)減 1。當這個值的引用次數(shù)變成 0 時,則說明沒有辦法再訪問這 個值了,因而就可以將其占用的內存空間回收回來。這樣,當垃圾收集器下次再運行時,它就會釋放那 些引用次數(shù)為零的值所占用的內存。
這種機制其實在js中并不常用,因為這種機制會產(chǎn)生循環(huán)引用的問題,『循環(huán)引用』指的是對象 A 中包含一個指向對象 B 的指針,而對象 B 中也包含一個指向對象 A 的引用。對于像js類的自動回收機制的語言來說,需要額外手動的去釋放內存,其實并不友好。例如,在下面的例子中:

function garbage(){
    var A = new Object();
    var B = new Object();
    A.property = B; 
    B.property = A;
}

由于對象A、B相互引用,引用次數(shù)都為2,所以其占用的內存并不能被自動釋放。
在IE的BOM和DOM中就采用了此類的引用計數(shù),在IE9以后,微軟轉而使用了標記清除的方式來管理內存,從而避免了兩種方式并存的局面。

內存管理

由于瀏覽器和其他桌面程序相比,系統(tǒng)分配給瀏覽器的內存相對較少,這樣做的目的主要是出于安全方面的考慮,防止運行 JavaScript 的網(wǎng)頁耗盡全部系統(tǒng)內存而導致系統(tǒng)崩潰。內存限制問題不僅會影響給變量分配內存,同時還會影響調用棧以及在一個線程中能夠同時執(zhí)行的語句數(shù)量。
因此,確保占用最少的內存可以讓頁面獲得更好的性能。而優(yōu)化內存占用的最佳方式,就是為執(zhí)行中的代碼只保存必要的數(shù)據(jù)。一旦數(shù)據(jù)不再有用,最好通過將其值設置為 null 來釋放其引用——這個做法叫做解除引用(dereferencing)。這一做法適用于大多數(shù)全局變量和全局對象的屬性。局部變量會在它們離開執(zhí)行環(huán)境時自動被解除引用。

function createPerson(name){
    var localPerson = new Object();
    localPerson.name = name;
 }
var globalPerson = createPerson("Nicholas"); // 手工解除 globalPerson 的引用
globalPerson = null;

不過,解除一個值的引用并不意味著自動回收該值所占用的內存。解除引用的真正作用是讓值脫離 執(zhí)行環(huán)境,以便垃圾收集器下次運行時將其回收。

小結
JavaScript 是一門具有自動垃圾收集機制的編程語言,開發(fā)人員不必關心內存分配和回收問題。可 以對 JavaScript 的垃圾收集例程作如下總結。

? 離開作用域的值將被自動標記為可以回收,因此將在垃圾收集期間被刪除。
? “標記清除”是目前主流的垃圾收集算法,這種算法的思想是給當前不使用的值加上標記,然
后再回收其內存。
? 另一種垃圾收集算法是“引用計數(shù)”,這種算法的思想是跟蹤記錄所有值被引用的次數(shù)。JavaScript
引擎目前都不再使用這種算法;但在 IE 中訪問非原生 JavaScript 對象(如 DOM 元素)時,這種
算法仍然可能會導致問題。
? 當代碼中存在循環(huán)引用現(xiàn)象時,“引用計數(shù)”算法就會導致問題。
? 解除變量的引用不僅有助于消除循環(huán)引用現(xiàn)象,而且對垃圾收集也有好處。為了確保有效地回
收內存,應該及時解除不再使用的全局對象、全局對象屬性以及循環(huán)引用變量的引用。

---參考《JavaScript高級程序設計第3版》

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/93781.html

相關文章

  • javascript垃圾回收機制內存管理

    摘要:另一種垃圾收集算法是引用計數(shù),這種算法的思想是跟蹤記錄所有值被引用的次數(shù)。當代碼中存在循環(huán)引用現(xiàn)象時,引用計數(shù)算法就會導致問題。 垃圾回收 javascript不同于c、c++的一個特點是:具有自動的垃圾回收機制,這就意味著,開發(fā)人員可以專注于業(yè)務,而不必把過多精力放在內存的管理上,提高開發(fā)效率。 所謂的垃圾回收就是找出那些不再繼續(xù)使用的變量,然后釋放其占用的內存。為此,垃圾收集器...

    klivitamJ 評論0 收藏0
  • JavaScript 闖關記》之垃圾回收內存管理

    摘要:內存回收此時,局部變量就沒有存在的必要了,因此可以釋放它們的內存以供將來使用。局部變量會在它們離開執(zhí)行環(huán)境時自動被解除引用,如下面這個例子所示手工解除的引用由于局部變量在函數(shù)執(zhí)行完畢后就離開了其執(zhí)行環(huán)境,因此無需我們顯式地去為它解除引用。 JavaScript 具有自動垃圾收集機制(GC:Garbage Collecation),也就是說,執(zhí)行環(huán)境會負責管理代碼執(zhí)行過程中使用的內存。而...

    Sleepy 評論0 收藏0
  • 深入淺出 JavaScript 內存管理垃圾回收

    摘要:可以改成下面代碼手動移除事件監(jiān)聽器和變量例四清除定時器清除變量鏈接觀察垃圾回收是怎么工作的在上面圖片中,可以觀察到,點擊按鈕,內存和節(jié)點數(shù)暴增,當點擊時,垃圾收集器回收了這些定時器變量等,從而釋放了內存。 簡介 本篇文章講解JavaScript 中垃圾回收機制,內存泄漏,結合一些常遇到的例子,相信各位看完后,會對JS 中垃圾回收機制有個深入的了解。 我的github,歡迎 star 內...

    oogh 評論0 收藏0
  • 【V8引擎】淺析Chrome V8引擎中垃圾回收機制內存泄露優(yōu)化策略

    摘要:一前言的垃圾回收機制使用垃圾回收機制來自動管理內存。垃圾回收器只會針對新生代內存區(qū)老生代指針區(qū)以及老生代數(shù)據(jù)區(qū)進行垃圾回收。分別對新生代和老生代使用不同的垃圾回收算法來提升垃圾回收的效率。 V8 實現(xiàn)了準確式 GC,GC 算法采用了分代式垃圾回收機制。因此,V8 將內存(堆)分為新生代和老生代兩部分。 一、前言 V8的垃圾回收機制:JavaScript使用垃圾回收機制來自動管理內存。垃...

    qingshanli1988 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<