摘要:向系統(tǒng)進(jìn)行的內(nèi)存申請(qǐng),并不是有需要時(shí)向系統(tǒng)即時(shí)申請(qǐng),而是由的最底層層先向系統(tǒng)申請(qǐng)一大塊的內(nèi)存,通過(guò)對(duì)上面三種列表的填充,建立一個(gè)類似于內(nèi)存池的管理機(jī)制。在程序運(yùn)行需要使用內(nèi)存的時(shí)候,會(huì)在內(nèi)存池中分配相應(yīng)的內(nèi)存供使用。
一、php內(nèi)存管理概述——Zend引擎
由于計(jì)算機(jī)的內(nèi)存由操作系統(tǒng)進(jìn)行管理,所以普通應(yīng)用程序是無(wú)法直接對(duì)內(nèi)存進(jìn)行訪問(wèn)的。
應(yīng)用程序只能向操作系統(tǒng)申請(qǐng)內(nèi)存,通常的應(yīng)用也是這么做的,在需要的時(shí)候通過(guò)類似malloc之類的庫(kù)函數(shù) 向操作系統(tǒng)申請(qǐng)內(nèi)存。
在一些對(duì)性能要求較高的應(yīng)用場(chǎng)景下是需要頻繁的使用和釋放內(nèi)存的, 比如Web服務(wù)器,編程語(yǔ)言等,由于向操作系統(tǒng)申請(qǐng)內(nèi)存空間會(huì)引發(fā)系統(tǒng)調(diào)用, 系統(tǒng)調(diào)用和普通的應(yīng)用層函數(shù)調(diào)用性能差別非常大,因?yàn)橄到y(tǒng)調(diào)用會(huì)將CPU從用戶態(tài)切換到內(nèi)核, 因?yàn)樯婕暗轿锢韮?nèi)存的操作,只有操作系統(tǒng)才能進(jìn)行,而這種切換的成本是非常大的, 如果頻繁的在內(nèi)核態(tài)和用戶態(tài)之間切換會(huì)產(chǎn)生性能問(wèn)題。
鑒于系統(tǒng)調(diào)用的開銷,一些對(duì)性能有要求的應(yīng)用通常會(huì)自己在用戶態(tài)進(jìn)行內(nèi)存管理, 例如第一次申請(qǐng)稍大的內(nèi)存留著備用,而使用完釋放的內(nèi)存并不是馬上歸還給操作系統(tǒng), 可以將內(nèi)存進(jìn)行復(fù)用,這樣可以避免多次的內(nèi)存申請(qǐng)和釋放所帶來(lái)的性能消耗。
PHP不需要顯式的對(duì)內(nèi)存進(jìn)行管理,這些工作都由Zend引擎進(jìn)行管理了。PHP內(nèi)部有一個(gè)內(nèi)存管理體系, 它會(huì)自動(dòng)將不再使用的內(nèi)存垃圾進(jìn)行釋放。
二、php中查看與設(shè)置內(nèi)存的相關(guān)參數(shù)與函數(shù)
配置內(nèi)存大?。?/p>
(1)php.ini中可以更改配置memory_limit = 32M (2)若環(huán)境中沒(méi)有禁用ini_set()函數(shù),可以通過(guò)此函數(shù)設(shè)置:ini_set("memory_limit", "128M");
查看內(nèi)存情況:
(1)memory_get_usage(),這個(gè)函數(shù)的作用是獲取 目前PHP腳本所用的內(nèi)存大小。 (2)memory_get_peak_usage(),這個(gè)函數(shù)的作用返回 當(dāng)前腳本到目前位置所占用的內(nèi)存峰值,這樣就可能獲取到目前的腳本的內(nèi)存需求情況。三、ZendMM內(nèi)存分配和銷毀
PHP底層對(duì)內(nèi)存的管理, 圍繞著小塊內(nèi)存列表(free_buckets)、 大塊內(nèi)存列表(large_free_buckets)和 剩余內(nèi)存列表(rest_buckets)三個(gè)列表來(lái)分層進(jìn)行的。
ZendMM向系統(tǒng)進(jìn)行的內(nèi)存申請(qǐng),并不是有需要時(shí)向系統(tǒng)即時(shí)申請(qǐng), 而是由ZendMM的最底層(heap層)先向系統(tǒng)申請(qǐng)一大塊的內(nèi)存,通過(guò)對(duì)上面三種列表的填充, 建立一個(gè)類似于內(nèi)存池的管理機(jī)制。
在程序運(yùn)行需要使用內(nèi)存的時(shí)候,ZendMM會(huì)在內(nèi)存池中分配相應(yīng)的內(nèi)存供使用。 這樣做的好處是避免了PHP向系統(tǒng)頻繁的內(nèi)存申請(qǐng)操作。
ZendMM在內(nèi)存銷毀的處理上采用與內(nèi)存申請(qǐng)相同的策略,當(dāng)程序unset一個(gè)變量或者是其他的釋放行為時(shí), ZendMM并不會(huì)直接立刻將內(nèi)存交回給系統(tǒng),而是只在自身維護(hù)的內(nèi)存池中將其重新標(biāo)識(shí)為可用, 按照內(nèi)存的大小整理到上面所說(shuō)的三種列表(small,large,free)之中,以備下次內(nèi)存申請(qǐng)時(shí)使用。
具體的詳情可參考:http://www.php-internals.com/...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/31117.html
摘要:為單進(jìn)程的由代執(zhí)行每一個(gè)請(qǐng)求由從進(jìn)程池中取出進(jìn)程初始化數(shù)據(jù)結(jié)構(gòu)創(chuàng)建進(jìn)程變量共享類似于的內(nèi)容為所有進(jìn)程所共享即單例模式默認(rèn)是采用磁盤文件實(shí)現(xiàn)的管理即變量是一次請(qǐng)求說(shuō)單獨(dú)的享有的不能被所有請(qǐng)求所共享共享由于每次請(qǐng)求代由創(chuàng)建進(jìn)程所以由共享問(wèn)題是使 php為單進(jìn)程的,由apache代執(zhí)行,每一個(gè)請(qǐng)求,由apache從進(jìn)程池中取出進(jìn)程,初始化數(shù)據(jù)結(jié)構(gòu),創(chuàng)建進(jìn)程. 變量共享,類似于session的...
摘要:分頁(yè)管理先說(shuō)說(shuō)虛擬內(nèi)存的概念。每個(gè)存在的虛擬頁(yè)面都保存在某個(gè)區(qū)域中,不屬于任何一個(gè)區(qū)域的虛擬頁(yè)是不存在的,不能被進(jìn)程使用內(nèi)核為系統(tǒng)中的每個(gè)進(jìn)程維護(hù)一個(gè)單獨(dú)的任務(wù)結(jié)構(gòu),任務(wù)中的一個(gè)字段指向,他描述了虛擬內(nèi)存的當(dāng)前狀態(tài)。 作者: 順風(fēng)車運(yùn)營(yíng)研發(fā)團(tuán)隊(duì) 李樂(lè) 第一章 從操作系統(tǒng)內(nèi)存管理說(shuō)起 程序是代碼和數(shù)據(jù)的集合,進(jìn)程是運(yùn)行著的程序;操作系統(tǒng)需要為進(jìn)程分配內(nèi)存;進(jìn)程運(yùn)行完畢需要釋放內(nèi)存;內(nèi)存管...
摘要:當(dāng)客戶端請(qǐng)求到達(dá)時(shí),進(jìn)程管理器選擇并連接到一個(gè)解釋器。什么是是一個(gè)管理器,是只用于的可以在下載得到其實(shí)是源代碼的一個(gè)補(bǔ)丁,旨在將進(jìn)程管理整合進(jìn)包中。與功能比較都是守護(hù)的進(jìn)程管理器。 什么是CGI CGI全稱是公共網(wǎng)關(guān)接口(Common Gateway Interface),HTTP服務(wù)器與你的或其它機(jī)器上的程序進(jìn)行交談的一種工具,其程序須運(yùn)行在網(wǎng)絡(luò)服務(wù)器上。 CGI可以用任何一種語(yǔ)言編...
摘要:的工作原理啟動(dòng)時(shí)載入進(jìn)程管理器或進(jìn)程管理器自身初始化,啟動(dòng)多個(gè)解釋器進(jìn)程可見多個(gè)并等待來(lái)自的連接。當(dāng)客戶端請(qǐng)求到達(dá)時(shí),進(jìn)程管理器選擇并連接到一個(gè)解釋器。什么是是一個(gè)管理器,是只用于的其實(shí)是源代碼的一個(gè)補(bǔ)丁,旨在將進(jìn)程管理整合進(jìn)包中。 什么是CGI CGI全稱是公共網(wǎng)關(guān)接口(Common Gateway Interface),HTTP服務(wù)器與你的或其它機(jī)器上的程序進(jìn)行交談的一種工具,其程...
摘要:本文將要講述發(fā)展歷程中的垃圾回收及內(nèi)存管理相關(guān)內(nèi)容,文末給出發(fā)展在各個(gè)階段有關(guān)內(nèi)存管理及垃圾回收內(nèi)核參考資料值得閱讀。引用計(jì)數(shù)在及以前的版本中,的垃圾回收采用的是引用計(jì)數(shù)算法?;厥罩芷诋?dāng)緩沖區(qū)滿時(shí),對(duì)緩沖區(qū)中的所有可能根進(jìn)行垃圾回收處理。 showImg(https://segmentfault.com/img/bVbe29F?w=800&h=440); 本文首發(fā)于 PHP 垃圾回收與...
閱讀 2794·2023-04-25 14:41
閱讀 2397·2021-11-23 09:51
閱讀 3687·2021-11-17 17:08
閱讀 1678·2021-10-18 13:31
閱讀 5559·2021-09-22 15:27
閱讀 920·2019-08-30 15:54
閱讀 2231·2019-08-30 13:16
閱讀 739·2019-08-29 17:04