PHP內存模型

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

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

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

session共享

因爲每次請求代由apache建立進程,因此由session共享問題,php是使用文件的機制達到session共享.windows

內存管理

和C語言同樣,一樣具備相關的函數
https://www.php.net/manual/zh/internals2.memory.management.php數組

php生命週期

這裏一張圖概述session

8ce302c402d81f00c37449068763d2be_1338x2269

Zend虛擬機

php的引擎爲Zend虛擬機
其中Zend虛擬機和js虛擬機相似,感受一個內容
運行流程數據結構

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

Zend和php關係

Zend Technologies公司來管理PHP的開發jvm

內存泄漏

因爲php屬於高級語言,自動管理內存,可是依舊會有內存泄漏的問題.函數

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

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/features.gc.collecting-cycles.php
https://researcher.watson.ibm.com/researcher/view.php?person=us-bacon

相關文章
相關標籤/搜索