日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

php 垃圾回收机制----写时复制和引用计数

發(fā)布時(shí)間:2023/12/18 php 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php 垃圾回收机制----写时复制和引用计数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  PHP使用引用計(jì)數(shù)和寫時(shí)復(fù)制來管理內(nèi)存。寫時(shí)復(fù)制保證了變量間復(fù)制值不浪費(fèi)內(nèi)存,引用計(jì)數(shù)保證了當(dāng)變量不再需要時(shí),將內(nèi)存釋放給操作系統(tǒng)。

  要理解PHP內(nèi)存管理,首先要理解一個(gè)概念----符號表。

  符號表的概念:

  一個(gè)變量有兩部分組成:變量名和變量值。而符號表就是將變量名映射到內(nèi)存中變量值所在地址的數(shù)組。

  寫時(shí)復(fù)制:

  當(dāng)一個(gè)變量的值復(fù)制到另一個(gè)變量時(shí),PHP沒有為復(fù)制值使用更多的內(nèi)存。相反,他會(huì)跟新符號表來說明這兩個(gè)變量擁有相同的內(nèi)存塊。所以下面的代碼實(shí)際上并沒有創(chuàng)建新數(shù)組:

      <?php

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

        $other ?= $people;  //數(shù)組并沒有被復(fù)制

      ?>

  如果修改任何一個(gè)副本,PHP將分配所需的內(nèi)存來進(jìn)行復(fù)制:

  $people[ 1 ] = "Tom";  //值改變,數(shù)組被復(fù)制,分配新的內(nèi)存

  通過延遲分配和復(fù)制,PHP在很多情形下節(jié)省了時(shí)間和內(nèi)存,這就是寫時(shí)復(fù)制。

  引用計(jì)數(shù):

  符號表中沒喲個(gè)職都有一個(gè)引用計(jì)數(shù)器,,它的值表示獲取那片內(nèi)存的方式的數(shù)目。

  在給$people和$other初始化賦值后,數(shù)組指向符號表,$people和$other引用計(jì)數(shù)器的值為2.換句話說,那一片內(nèi)存有兩種方式可以得到:$people和$other。

  但是當(dāng)$people[ 1 ]的只改變之后,PHP為$people創(chuàng)建一個(gè)新的數(shù)組,這時(shí),$people和$other的引用計(jì)數(shù)器的值都為1.當(dāng)一個(gè)變量離開作用域,如函數(shù)參數(shù)和局部變量到達(dá)函數(shù)末尾時(shí),應(yīng)用計(jì)數(shù)器的值減去1.當(dāng)一個(gè)變量在其他內(nèi)存空間被賦值時(shí),舊值得引用計(jì)數(shù)減1。當(dāng)引用計(jì)數(shù)的值為0時(shí),他的內(nèi)存被釋放。

  這就是引用計(jì)數(shù)。

  引用計(jì)數(shù)是首選的內(nèi)存管理方式。保持變量作用域限制于函數(shù)中,通過值來傳遞,并讓引用計(jì)數(shù)負(fù)責(zé)內(nèi)存管理。如果你想主動(dòng)獲得更多的信息或者控制權(quán)來釋放一個(gè)變量的值,可以使用isset()和unset()函數(shù)。

轉(zhuǎn)載于:https://www.cnblogs.com/phpcoder/p/4462210.html

總結(jié)

以上是生活随笔為你收集整理的php 垃圾回收机制----写时复制和引用计数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。