PHP內存模型

php爲單進程的,由apache代執行,每一個請求,由apache從進程池中取出進程,初始化數據結構,創建進程.

變量共享,類似於session的內容,爲所有進程所共享,即單例模式.默認是採用磁盤文件實現session的管理

即static變量,是一次請求說單獨的享有的,不能被所有請求所共享.

session共享

由於每次請求代由apache創建進程,所以由session共享問題,php是使用文件的機制達到session共享.

內存管理

和C語言一樣,同樣具有相關的函數
https://www.php.net/manual/zh...

php生命週期

這裏一張圖概述

8ce302c402d81f00c37449068763d2be_1338x2269

Zend虛擬機

php的引擎爲Zend虛擬機
其中Zend虛擬機和js虛擬機類似,感覺一個內容
運行流程

2019-05-04-00-05-49----

Zend和php關係

Zend Technologies公司來管理PHP的開發

內存泄漏

由於php屬於高級語言,自動管理內存,但是依舊會有內存泄漏的問題.

使用valgrind進行內存泄漏的分析

php內存管理

分爲三層 存儲層(storage)、堆層(heap)和接口層(emalloc/efree)

06-02-01-zend-memeory-manager

一張圖

php是使用鏈來管理的.

一張圖

06-02-02-free_buckets

定義一個數組指針,每次通過數組指針指向所請求的內存空間

在單個請求初始化的時候,內核會初始化free_buckets列表,其是一個數組指針,通過存儲的是雙向鏈表的頭尾指針,用來達到對內存的管理

關於js的內存

js的內存的使用原型鏈的方式,有一個總的windows節點,每次創建的時候,會掛載到windows節點上

關於java內存

之前說明的全是動態語言的內存機制,現在說明靜態語言,以java爲例,每次寫好java文件以後,編譯生成class文件,class文件即定義了內存的結構,使用裝載命令,裝載進入內存,即內存結構被固定化. 在運行的期間,當使用new命令,將會根據class文件定義的內存模型,在jvm的虛擬機中的創建出一樣的對象,並進行指向,運算的時候,本質通過棧進行運算.

通過這種方式,靜態語言模擬動態語言.

關於動靜態語言

靜態語言定義好的內存結構,進行運算即可

動態語言,和原型鏈類型,進行加載上去即可.

垃圾回收

之前php只是簡單的引用計數法進行垃圾回收.
不想看了 http://docs.php.net/manual/zh...
https://researcher.watson.ibm...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章