久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放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)站

      定位分析內(nèi)存泄漏的原因和后果

      定位分析內(nèi)存泄漏的原因和后果

      內(nèi)部泄漏錯(cuò)誤代碼:

      Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes)

      觀察php程序內(nèi)存使用情況

      php提提供了兩個(gè)方法來(lái)獲取當(dāng)前程序的內(nèi)存使用情況。
      memorygetusage(),這個(gè)函數(shù)的作用是獲取目前PHP腳本所用的內(nèi)存大小。

      memorygetpeak_usage(),這個(gè)函數(shù)的作用返回當(dāng)前腳本到目前位置所占用的內(nèi)存峰值,這樣就可能獲取到目前的腳本的內(nèi)存需求情況。

      int memory_get_usage ([ bool $real_usage = false ] )   int memory_get_peak_usage ([ bool $real_usage = false ] )

      函數(shù)默認(rèn)得到的是調(diào)用emalloc()占用的內(nèi)存,如果設(shè)置參數(shù)為TRUE,則得到的是實(shí)際程序向系統(tǒng)申請(qǐng)的內(nèi)存。因?yàn)?PHP 有自己的內(nèi)存管理機(jī)制,所以有時(shí)候盡管內(nèi)部已經(jīng)釋放了內(nèi)存但并沒(méi)有還給系統(tǒng)。

      linux 系統(tǒng)文件 /proc/{$pid}/status 會(huì)記錄某個(gè)進(jìn)程的運(yùn)行狀態(tài),里面的 VmRSS 字段記錄了該進(jìn)程使用的常駐物理內(nèi)存(Residence),這個(gè)就是該進(jìn)程實(shí)際占用的物理內(nèi)存了,用這個(gè)數(shù)據(jù)比較靠譜,在程序里面提取這個(gè)值也很容易 。

      場(chǎng)景一:程序操作數(shù)據(jù)過(guò)大

      情景還原:一次性讀取超過(guò)php可用內(nèi)存上限的數(shù)據(jù)導(dǎo)致內(nèi)存耗盡

      實(shí)例:

      <?php  ini_set('memory_limit', '128M');   $string = str_pad('1', 128 * 1024 * 1024);     Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 134217729 bytes)  in /Users/zouyi/php-oom/bigfile.php on line 3

      這是告訴我們程序運(yùn)行時(shí)試圖分配新內(nèi)存時(shí)由于達(dá)到了PHP允許分配的內(nèi)存上限而拋出致命錯(cuò)誤,無(wú)法繼續(xù)執(zhí)行了,在 java 開發(fā)中一般稱之為 OOM ( Out Of Memory ) 。
      PHP 配置內(nèi)存上限是在php.ini中設(shè)置memory_limit,PHP 5.2 以前這個(gè)默認(rèn)值是8M,PHP 5.2 的默認(rèn)值是16M,在這之后的版本默認(rèn)值都是128M。
      問(wèn)題現(xiàn)象:特定數(shù)據(jù)處理時(shí)可復(fù)現(xiàn),做任何 IO 操作都有可能遇到此類問(wèn)題,比如:一次 mysql 查詢返回大量數(shù)據(jù)、一次把大文件讀取進(jìn)程序等。

      解決方法:

      1、能用錢解決的問(wèn)題都不是問(wèn)題,如果程序要讀大文件的機(jī)會(huì)不是很多,且上限可預(yù)期,那么通過(guò)ini_set('memory_limit', '1G');來(lái)設(shè)置一個(gè)更大的值或者memory_limit=-1。內(nèi)存管夠的話讓程序一直跑也可以。

      2、如果程序需要考慮在小內(nèi)存機(jī)器上也能正常使用,那就需要優(yōu)化程序了。如下,代碼復(fù)雜了很多。

      <?php   //php7 以下版本通過(guò) composer 引入 paragonie/random_compat ,為了方便來(lái)生成一個(gè)隨機(jī)名稱的臨時(shí)文件   require "vendor/autoload.php";     ini_set('memory_limit', '128M');   //生成臨時(shí)文件存放大字符串   $fileName = 'tmp'.bin2hex(random_bytes(5)).'.txt';   touch($fileName);   for ( $i = 0; $i < 128; $i++ ) {       $string = str_pad('1', 1 * 1024 * 1024);       file_put_contents($fileName, $string, FILE_APPEND);   }   $handle = fopen($fileName, "r");   for ( $i = 0; $i <= filesize($fileName) / 1 * 1024 * 1024; $i++ )  {      //do something      $string = fread($handle, 1 * 1024 * 1024);   }     fclose($handle);   unlink($fileName);

      場(chǎng)景二、程序操作大數(shù)據(jù)時(shí)產(chǎn)生拷貝

      情景還原:執(zhí)行過(guò)程中對(duì)大變量進(jìn)行了復(fù)制,導(dǎo)致內(nèi)存不夠用。

      <?php   ini_set("memory_limit",'1M');     $string = str_pad('1', 1* 750 *1024);   $string2 = $string;  $string2 .= '1';     Fatal error: Allowed memory size of 1048576 bytes exhausted (tried to allocate 768001 bytes)  in /Users/zouyi/php-oom/unset.php on line 8     Call Stack:       0.0004     235440   1. {main}() /Users/zouyi/php-oom/unset.php:0    zend_mm_heap corrupted

      問(wèn)題現(xiàn)象:局部代碼執(zhí)行過(guò)程中占用內(nèi)存翻倍。

      問(wèn)題分析:
      php 是寫時(shí)復(fù)制(Copy On Write),也就是說(shuō),當(dāng)新變量被賦值時(shí)內(nèi)存不發(fā)生變化,直到新變量的內(nèi)容被操作時(shí)才會(huì)產(chǎn)生復(fù)制。

      解決方法:

      及早釋放無(wú)用變量,或者以引用的形式操作原始數(shù)據(jù)。

      <?php   ini_set("memory_limit",'1M');     $string = str_pad('1', 1* 750 *1024);   $string2 = $string;  unset($string);   $string2 .= '1';     <?php   ini_set("memory_limit",'1M');     $string = str_pad('1', 1* 750 *1024);   $string2 = &$string;   $string2 .= '1';     unset($string2, $string);

      場(chǎng)景三、配置不合理系統(tǒng)資源耗盡

      情景還原:因配置不合理導(dǎo)致內(nèi)存不夠用,2G 內(nèi)存機(jī)器上設(shè)置最大可以啟動(dòng) 100 個(gè) php-fpm 子進(jìn)程,但實(shí)際啟動(dòng)了 50 個(gè) php-fpm 子進(jìn)程后無(wú)法再啟動(dòng)

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