PHP 使用自动内存管理和垃圾回收机制来处理内存分配和释放
-
引用计数:当一个变量被创建时,PHP 会为其分配内存。每个变量都有一个引用计数器,用于跟踪指向该变量的引用数量。当有新的引用指向该变量时,引用计数器加1;当引用被销毁或更改时,引用计数器减1。当引用计数器减少到0时,表示没有任何引用指向该变量,因此可以安全地释放其内存。
-
垃圾回收:尽管引用计数机制可以有效地管理内存,但在某些情况下,它可能无法检测到无法访问的循环引用。例如,两个对象相互引用,但没有其他引用指向它们。这种情况下,即使它们实际上是不可访问的,引用计数也不会减少到0。为了解决这个问题,PHP 使用垃圾回收机制来检测并回收这些无法访问的循环引用。
垃圾回收过程大致如下:
a. 标记:垃圾回收器从全局变量和函数参数开始,递归地遍历所有可访问的引用。在这个过程中,它会标记出所有可访问的变量。未被标记的变量被认为是无法访问的,因此可以被回收。
b. 清除:垃圾回收器遍历堆内存,回收未被标记的变量所占用的内存。
c. 重置:最后,垃圾回收器重置所有已标记变量的标记状态,以便下次垃圾回收时使用。
PHP 垃圾回收器会在以下情况触发:
- 当内存使用量超过了分配给 PHP 的内存限制时。
- 当执行完一个函数或方法时。
- 当调用
gc_collect_cycles()
函数时。
需要注意的是,频繁地进行垃圾回收可能会影响性能。因此,在编写 PHP 代码时,应尽量减少不必要的全局变量和长时间持有的引用,以减小垃圾回收的负担。