php爲單進程的,由apache代執行,每個請求,由apache從進程池中取出進程,初始化數據結構,建立進程.php
變量共享,相似於session的內容,爲全部進程所共享,即單例模式.默認是採用磁盤文件實現session的管理java
即static變量,是一次請求說單獨的享有的,不能被全部請求所共享.apache
因爲每次請求代由apache建立進程,因此由session共享問題,php是使用文件的機制達到session共享.windows
和C語言同樣,一樣具備相關的函數
https://www.php.net/manual/zh/internals2.memory.management.php數組
這裏一張圖概述session
php的引擎爲Zend虛擬機
其中Zend虛擬機和js虛擬機相似,感受一個內容
運行流程數據結構
Zend Technologies公司來管理PHP的開發jvm
因爲php屬於高級語言,自動管理內存,可是依舊會有內存泄漏的問題.函數
使用valgrind進行內存泄漏的分析.net
分爲三層 存儲層(storage)、堆層(heap)和接口層(emalloc/efree)
一張圖
php是使用鏈來管理的.
一張圖
定義一個數組指針,每次經過數組指針指向所請求的內存空間
在單個請求初始化的時候,內核會初始化free_buckets列表,其是一個數組指針,經過存儲的是雙向鏈表的頭尾指針,用來達到對內存的管理
js的內存的使用原型鏈的方式,有一個總的windows節點,每次建立的時候,會掛載到windows節點上
以前說明的全是動態語言的內存機制,如今說明靜態語言,以java爲例,每次寫好java文件之後,編譯生成class文件,class文件即定義了內存的結構,使用裝載命令,裝載進入內存,即內存結構被固定化. 在運行的期間,當使用new命令,將會根據class文件定義的內存模型,在jvm的虛擬機中的建立出同樣的對象,並進行指向,運算的時候,本質經過棧進行運算.
經過這種方式,靜態語言模擬動態語言.
靜態語言定義好的內存結構,進行運算便可
動態語言,和原型鏈類型,進行加載上去便可.
以前php只是簡單的引用計數法進行垃圾回收.
不想看了 http://docs.php.net/manual/zh/features.gc.collecting-cycles.php
https://researcher.watson.ibm.com/researcher/view.php?person=us-bacon