• <sub id="h4knl"><ol id="h4knl"></ol></sub>
    <sup id="h4knl"></sup>
      <sub id="h4knl"></sub>

      <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
      1. <strong id="h4knl"></strong>

      2. Javascript垃圾收集機制介紹

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

        Javascript垃圾收集機制介紹

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

        Javascript垃圾收集機制介紹

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

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

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

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

          舉個例子來說:

          復(fù)制代碼 代碼如下:

          function countMethod(){

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

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

          object1.method1 = object2; // object1 計數(shù)器 -1,object2 計數(shù)器 +1

          object2.method2 = object1; // object1 計數(shù)器 +1,object2 計數(shù)器 -1

          }

          此函數(shù)運行退出后,object1 的計數(shù)器讀數(shù)為 1,object2 的計數(shù)器度數(shù)為 1。所以兩個變量都不會被銷毀。如果大量的這樣的程序存在于函數(shù)體內(nèi),就會導(dǎo)致大量的內(nèi)存被浪費而無法回收,從而導(dǎo)致內(nèi)存的泄露。

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

          復(fù)制代碼 代碼如下:

          object1.method1 = null;

          object2.method2 = null;

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

          復(fù)制代碼 代碼如下:

          function countMethod(){

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

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

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

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

          通過上例看出,正常情況下,當(dāng)函數(shù)運行結(jié)束后,object1 object2的讀數(shù)均為 0,在下一個垃圾收集周期時,會被回收并且釋放其所占用的內(nèi)存。

        《&.doc》
        将本文的Word文档下载到电脑,方便收藏和打印
        推荐度:
        点击下载文档

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

        perl- javascript中class的機制05-03

        JavaScript數(shù)組常用方法介紹09-04

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

        對javascript的理解08-08

        JAVA垃圾收集算法與內(nèi)存泄露的解決方法12-04

        常用的JavaScript模式09-22

        Javascript的this用法簡述08-15

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

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

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

        在线咨询
        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码
      3. <sub id="h4knl"><ol id="h4knl"></ol></sub>
        <sup id="h4knl"></sup>
          <sub id="h4knl"></sub>

          <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
          1. <strong id="h4knl"></strong>

          2. 视频在线欧美十亚洲曰本 | 婷婷5月色综合色综合 | 夜夜爽天天爽一区 | 中文成人无字幕乱码精品区 | 免费人成在线观看99 | 亚洲视频高清在线人 |

            Javascript垃圾收集機制介紹

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

            Javascript垃圾收集機制介紹

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

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

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

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

              舉個例子來說:

              復(fù)制代碼 代碼如下:

              function countMethod(){

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

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

              object1.method1 = object2; // object1 計數(shù)器 -1,object2 計數(shù)器 +1

              object2.method2 = object1; // object1 計數(shù)器 +1,object2 計數(shù)器 -1

              }

              此函數(shù)運行退出后,object1 的計數(shù)器讀數(shù)為 1,object2 的計數(shù)器度數(shù)為 1。所以兩個變量都不會被銷毀。如果大量的這樣的程序存在于函數(shù)體內(nèi),就會導(dǎo)致大量的內(nèi)存被浪費而無法回收,從而導(dǎo)致內(nèi)存的泄露。

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

              復(fù)制代碼 代碼如下:

              object1.method1 = null;

              object2.method2 = null;

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

              復(fù)制代碼 代碼如下:

              function countMethod(){

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

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

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

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

              通過上例看出,正常情況下,當(dāng)函數(shù)運行結(jié)束后,object1 object2的讀數(shù)均為 0,在下一個垃圾收集周期時,會被回收并且釋放其所占用的內(nèi)存。