久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      php如何管理內(nèi)存

      內(nèi)存管理一般會(huì)包括以下內(nèi)容:

      php如何管理內(nèi)存

      是否有足夠的內(nèi)存供我們的程序使用;

      如何從足夠可用的內(nèi)存中獲取部分內(nèi)存;

      對(duì)于使用后的內(nèi)存,是否可以將其銷毀并將其重新分配給其它程序使用。(推薦學(xué)習(xí):PHP編程從入門到精通)

      與此對(duì)應(yīng),PHP的內(nèi)存管理也包含這樣的內(nèi)容,只是這些內(nèi)存在ZEND內(nèi)核中是以宏的形式作為接口提供給外部使用。

      后面兩個(gè)操作分別對(duì)應(yīng)emalloc宏,efree宏,而第一個(gè)操作可以根據(jù)emalloc宏返回結(jié)果檢測(cè)。

      PHP的內(nèi)存管理可以被看作是分層(hierarchical)的。 它分為三層:存儲(chǔ)層(storage)、堆層(heap)和接口層(emalloc/efree)。

      存儲(chǔ)層通過 malloc()、mmap() 等函數(shù)向系統(tǒng)真正的申請(qǐng)內(nèi)存,并通過 free() 函數(shù)釋放所申請(qǐng)的內(nèi)存。 存儲(chǔ)層通常申請(qǐng)的內(nèi)存塊都比較大,這里申請(qǐng)的內(nèi)存大并不是指storage層結(jié)構(gòu)所需要的內(nèi)存大, 只是堆層通過調(diào)用存儲(chǔ)層的分配方法時(shí),其以大塊大塊的方式申請(qǐng)的內(nèi)存,存儲(chǔ)層的作用是將內(nèi)存分配的方式對(duì)堆層透明化。

      如圖所示,PHP內(nèi)存管理器。PHP在存儲(chǔ)層共有4種內(nèi)存分配方案: malloc,win32,mmap_anon,mmap_zero, 默認(rèn)使用malloc分配內(nèi)存,如果設(shè)置了ZEND_WIN32宏,則為windows版本,調(diào)用HeapAlloc分配內(nèi)存, 剩下兩種內(nèi)存方案為匿名內(nèi)存映射,并且PHP的內(nèi)存方案可以通過設(shè)置環(huán)境變量來修改。

      php如何管理內(nèi)存

      PHP內(nèi)存管理機(jī)制 var_dump(memory_get_usage());   //獲取內(nèi)存 $a = "laruence";                //定義一個(gè)變量 var_dump(memory_get_usage());   //定義變量之后獲取內(nèi)存 unset($a);                      //刪除該變量 var_dump(memory_get_usage());   //刪除變量后獲取內(nèi)存  從上面可以看出php的內(nèi)存管理機(jī)制是:預(yù)先給出一塊空間,用來存儲(chǔ)變量,當(dāng)空間不夠時(shí),再申請(qǐng)一塊新的空間。  1.存儲(chǔ)變量名,存在符號(hào)表。  2.變量值存儲(chǔ)在內(nèi)存空間。  3.在刪除變量的時(shí)候,會(huì)將變量值存儲(chǔ)的空間釋放,而變量名所在的符號(hào)表不會(huì)減小。  var_dump(memory_get_usage());  //獲取內(nèi)存 //定義100個(gè)變量 for($i=0;$i<100;$i++) {     $a = "test".$i;     $$a = "hello"; } //獲取定義100個(gè)變量之后的內(nèi)存 var_dump(memory_get_usage()); //定義100個(gè)變量并刪除 for($i=0;$i<100;$i++) {     $a = "test".$i;     unset($$a); } //獲取刪除之后的內(nèi)存 var_dump(memory_get_usage());   從上面可以看出,雖然刪除后內(nèi)存變小了,但還是比沒定義變量之前時(shí)大,這是因?yàn)殡m然刪除了變量的值,但變量名沒有被刪除。  php垃圾回收機(jī)制  PHP變量存儲(chǔ)是存儲(chǔ)在一個(gè)zval容器里面的  1.類型 2.值 3.is_ref 代表是否有地址引用 4.refcount 指向該值的變量數(shù)量  1.變量賦值的時(shí)候:is_ref為false  refcount為1  $a = 1; xdebug_debug_zval('a'); echo PHP_EOL;  2.將變量a的值賦給變量b,變量b不會(huì)立刻去在內(nèi)存中存儲(chǔ)值,而是先指向變量a的值,一直到變量a有任何操作的時(shí)候  $b = $a; xdebug_debug_zval('a'); echo PHP_EOL;  3.因?yàn)槌绦蛴植僮髁俗兞縜,所以變量b會(huì)自己申請(qǐng)一塊內(nèi)存將值放進(jìn)去。所以變量a的zavl容器中refcount會(huì)減1變?yōu)?,變量c指向a,所以refcount會(huì)加1變?yōu)?  $c = &$a; xdebug_debug_zval('a'); echo PHP_EOL; xdebug_debug_zval('b'); echo PHP_EOL;

      垃圾回收:

      1.在5.2版本或之前版本,PHP會(huì)根據(jù)refcount值來判斷是不是垃圾

      如果refcount值為0,PHP會(huì)當(dāng)做垃圾釋放掉

      這種回收機(jī)制有缺陷,對(duì)于環(huán)狀引用的變量無法回收

      2.在5.3之后版本改進(jìn)了垃圾回收機(jī)制

      如果發(fā)現(xiàn)一個(gè)zval容器中的refcount在增加,說明不是垃圾

      如果發(fā)現(xiàn)一個(gè)zval容器中的refcount在減少,如果減到了0,直接當(dāng)做垃圾回收

      如果發(fā)現(xiàn)一個(gè)zval容器中的refcount在減少,并沒有減到0,PHP會(huì)把該值放到緩沖區(qū),當(dāng)做有可能是垃圾的懷疑對(duì)象。

      當(dāng)緩沖區(qū)達(dá)到了臨界值,PHP會(huì)自動(dòng)調(diào)用一個(gè)方法去遍歷每一個(gè)值,如果發(fā)現(xiàn)是垃圾就清理

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)