激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频

Javascript垃圾收集機制介紹

時(shí)間:2024-09-08 04:34:20 JavaScript 我要投稿
  • 相關(guān)推薦

Javascript垃圾收集機制介紹

  經(jīng)常使用 Javascript 的人會(huì )琢磨其垃圾收集機制,Javascript 并不像 C,C++ 那樣需要開(kāi)發(fā)者手動(dòng)去清除垃圾,在編寫(xiě) Javascript 程序是,開(kāi)發(fā)者無(wú)需關(guān)心內存使用問(wèn)題,所需內存分配以及無(wú)用內存(垃圾)的回收完全實(shí)現了自動(dòng)管理。究其根源,主要是程序收集那些不再使用的變量,并且釋放其占用的內存。因此,垃圾收集機制會(huì )按照固定時(shí)間間隔,周期性反復的執行這一操作。

Javascript垃圾收集機制介紹

  舉例來(lái)說(shuō),局部變量只存在于函數內部,程序會(huì )為局部變量在棧內存或堆內存中分配對應的存儲空間,當函數運行結束,局部變量所占用的內存就沒(méi)有存在的必要了,這時(shí)程序會(huì )釋放局部變量所占用的內存供其他變量使用。這是程序最簡(jiǎn)單釋放內存的方法,但是很多時(shí)候,程序中變量會(huì )一直被使用,此時(shí)垃圾收集機制必須跟蹤變量并且判斷其是否被使用,是否可以釋放其內存空間。

  垃圾收集機制主要判斷變量釋放內存空間的方法有兩個(gè):其一是標記清除法,其二是引用計數法。

  一、標記法,每個(gè)變量都有其運行環(huán)境,變量創(chuàng )建后會(huì )在某種環(huán)境中運行,比如創(chuàng )建一個(gè)局部變量,局部變量會(huì )運行在函數體內。當函數運行時(shí),會(huì )標記局部變量為“進(jìn)入環(huán)境”,當函數體運行結束后,意味著(zhù)變量脫離了其運行環(huán)境,此時(shí)則將變量標記為“離開(kāi)環(huán)境”。對于“離開(kāi)環(huán)境”的變量,垃圾收集機制會(huì )進(jìn)行相應記錄,并且在下一個(gè)回收周期時(shí)將其釋放。

  二、引用計數法,跟蹤記錄每個(gè)值的被引用次數。聲明一個(gè)變量并將一個(gè)引用類(lèi)型值賦給該變量時(shí),這個(gè)值得引用次數就是 1。如果同一個(gè)值又被賦給另外一個(gè)變量,則該值的引用次數加 1。相反,如果包含對這個(gè)值的引用的變量又取得另外一個(gè)值,這個(gè)值得引用次數減 1。當這個(gè)值得引用次數為 0 時(shí),則說(shuō)明沒(méi)有辦法再訪(fǎng)問(wèn)到此值,因此就可以將其占用的內存空間回收。當垃圾收集器在下一個(gè)周期運行時(shí),會(huì )釋放引用次數為零的值所占用的內存空間。(原文解釋參考:Javascript 高級程序設計 - 第二版)

  舉個(gè)例子來(lái)說(shuō):

  復制代碼 代碼如下:

  function countMethod(){

  var object1 = new Object(); // 聲明變量,計數器由 0 變?yōu)?1

  var object2 = new Object(); // 聲明變量,計數器由 0 變?yōu)?1

  object1.method1 = object2; // object1 計數器 -1,object2 計數器 +1

  object2.method2 = object1; // object1 計數器 +1,object2 計數器 -1

  }

  此函數運行退出后,object1 的計數器讀數為 1,object2 的計數器度數為 1。所以?xún)蓚(gè)變量都不會(huì )被銷(xiāo)毀。如果大量的這樣的程序存在于函數體內,就會(huì )導致大量的內存被浪費而無(wú)法回收,從而導致內存的泄露。

  上述問(wèn)題解決方法,手動(dòng)釋放 object1 object2 所占用的內存。即:

  復制代碼 代碼如下:

  object1.method1 = null;

  object2.method2 = null;

  對比上面的例子,舉一個(gè)正常情況下的例子。

  復制代碼 代碼如下:

  function countMethod(){

  var object1 = new Object(); // 聲明變量,計數器由 0 變?yōu)?1

  var object2 = new Object(); // 聲明變量,計數器由 0 變?yōu)?1

  object1.method1 = "This is object1"; // object1 計數器 -1,object1 讀數變?yōu)?

  object2.method2 = "This is object2"; // object2 計數器 -1,object2 讀數變?yōu)?}

  通過(guò)上例看出,正常情況下,當函數運行結束后,object1 object2的讀數均為 0,在下一個(gè)垃圾收集周期時(shí),會(huì )被回收并且釋放其所占用的內存。

【Javascript垃圾收集機制介紹】相關(guān)文章:

perl- javascript中class的機制05-03

JavaScript數組常用方法介紹09-04

javascript克隆對象深度介紹07-25

對javascript的理解08-08

JAVA垃圾收集算法與內存泄露的解決方法12-04

常用的JavaScript模式09-22

Javascript的this用法簡(jiǎn)述08-15

有關(guān)深入理解JavaScript中的并行處理的介紹10-14

JavaScript學(xué)習筆記08-24

JavaScript 基礎教學(xué)09-29

激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频