PHP内存模型

53次阅读

共计 985 个字符,预计需要花费 3 分钟才能阅读完成。

php 为单进程的, 由 apache 代执行, 每一个请求, 由 apache 从进程池中取出进程, 初始化数据结构, 创建进程.

变量共享, 类似于 session 的内容, 为所有进程所共享, 即单例模式. 默认是采用磁盘文件实现 session 的管理

即 static 变量, 是一次请求说单独的享有的, 不能被所有请求所共享.

session 共享

由于每次请求代由 apache 创建进程, 所以由 session 共享问题,php 是使用文件的机制达到 session 共享.

内存管理

和 C 语言一样, 同样具有相关的函数
https://www.php.net/manual/zh…

php 生命周期

这里一张图概述

Zend 虚拟机

php 的引擎为 Zend 虚拟机
其中 Zend 虚拟机和 js 虚拟机类似, 感觉一个内容
运行流程

Zend 和 php 关系

Zend Technologies 公司来管理 PHP 的开发

内存泄漏

由于 php 属于高级语言, 自动管理内存, 但是依旧会有内存泄漏的问题.

使用 valgrind 进行内存泄漏的分析

php 内存管理

分为三层 存储层(storage)、堆层(heap)和接口层(emalloc/efree)

一张图

php 是使用链来管理的.

一张图

定义一个数组指针, 每次通过数组指针指向所请求的内存空间

在单个请求初始化的时候, 内核会初始化 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…

正文完
 0