php 記憶體回收機制----寫時複製和引用計數

來源:互聯網
上載者:User
  PHP使用引用計數和寫時複製來管理記憶體。寫時複製保證了變數間複製值不浪費記憶體,引用計數保證了當變數不再需要時,將記憶體釋放給作業系統。

  要理解PHP記憶體管理,首先要理解一個概念----符號表。

  符號表的概念:

  一個變數有兩部分組成:變數名和變數值。而符號表就是將變數名映射到記憶體中變數值所在地址的數組。

  寫時複製:

  當一個變數的值複製到另一個變數時,PHP沒有為複製值使用更多的記憶體。相反,他會跟新符號表來說明這兩個變數擁有相同的記憶體塊。所以下面的代碼實際上並沒有建立新數組:

      

        $people = array( "Alice","Bob" );

        $other = $people;  //數組並沒有被複製

      ?>

  如果修改任何一個副本,PHP將分配所需的記憶體來進行複製:

  $people[ 1 ] = "Tom";  //值改變,數組被複製,分配新的記憶體

  通過延遲分配和複製,PHP在很多情形下節省了時間和記憶體,這就是寫時複製。

  引用計數:

  符號表中沒喲個職都有一個引用計數器,,它的值表示擷取那片記憶體的方式的數目。

  在給$people和$other初始化賦值後,數組指向符號表,$people和$other引用計數器的值為2.換句話說,那一片記憶體有兩種方式可以得到:$people和$other。

  但是當$people[ 1 ]的只改變之後,PHP為$people建立一個新的數組,這時,$people和$other的引用計數器的值都為1.當一個變數離開範圍,如函數參數和局部變數到達函數末尾時,應用計數器的值減去1.當一個變數在其他記憶體空間被賦值時,舊值得引用計數減1。當引用計數的值為0時,他的記憶體被釋放。

  這就是引用計數。

  引用計數是首選的記憶體管理方式。保持變數範圍限制於函數中,通過值來傳遞,並讓引用計數負責記憶體管理。如果你想主動獲得更多的資訊或者控制權來釋放一個變數的值,可以使用isset()和unset()函數。

以上就介紹了php 記憶體回收機制----寫時複製和引用計數,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.