PHP 内存模型简要介绍

在 PHP 中,内存被组织成几个区域,每个区域都有不同的用途。 两个主要区域是堆栈和堆。

栈用于存储函数调用帧,而堆用于存储动态数据,例如对象和数组。 堆栈的大小是有限的,而堆可以根据需要动态增长。

执行 PHP 脚本时,PHP 运行时会自动管理内存分配和释放。 PHP 使用垃圾收集机制来释放不再使用的内存。 在 PHP 中管理内存的三种主要方法是:引用计数、标记清除和分代收集。

引用计数是最简单的机制,它通过跟踪对特定数据片段的引用次数来工作。 当引用计数达到零时,数据不再被使用,内存可以被释放。

标记清除是一种更高级的机制,它通过扫描内存堆来识别所有正在使用的对象。 任何未标记为正在使用的对象都被视为垃圾并被释放。

分代收集是另一种用于管理 PHP 内存的机制。 它的工作原理是将堆分成不同的代,并对每一代应用不同的垃圾收集技术。

下面是演示 PHP 如何管理内存的示例代码片段:

// 创建一个新对象
$myObject = new MyClass();

// 添加对对象的引用
$myReference = $myObject;

// 删除引用
unset($myReference);

// 该对象仍在使用中,因此在删除所有对它的引用之前不会对其进行垃圾回收

在此示例中,我们创建了一个 MyClass 类型的新对象,然后添加了对它的引用。 然后我们使用 unset() 函数删除引用。 但是,因为该对象仍在使用中,所以在删除所有对它的引用之前不会对其进行垃圾回收。

PHP 内存模型可以被认为是一个大的、线性的内存块,它被分成不同的段,每个段都有特定的用途。 这些段包括堆栈、堆和全局区域。

栈用于存放局部变量、函数参数和函数的返回地址。 当一个函数被调用时,一个新的帧被压入栈中,其中包含局部变量和函数参数。 当函数返回时,帧从堆栈中弹出并释放其内存。

堆用于存储动态分配的内存,例如对象和数组。 堆上的内存是使用 new 和 unset 等函数手动分配和释放的。 堆由 PHP 内存管理器管理,它跟踪哪些内存块正在使用,哪些是空闲的。 内存管理器负责在必要时分配新的内存块,并在不再需要时释放内存。

全局区用于存放全局变量和常量。 这些变量可以从程序的任何地方访问,并在程序启动时被初始化。

除了这些段之外,PHP 还使用垃圾收集器来管理内存。 垃圾收集器定期扫描堆以查找并删除任何未使用的内存。 这有助于防止内存泄漏并确保尽可能高效地使用内存。

下面是在 PHP 中使用堆的示例:

// 在堆上分配内存
$my_array = array(1, 2, 3);
$my_object = new MyClass();

// 释放堆上的内存
unset($my_array);
unset($my_object);

在此示例中,使用 array() 和 new 运算符在堆上分配内存。 使用 unset() 函数释放内存,它告诉 PHP 内存管理器不再需要内存。