浅谈PHP的内存管理,与GC垃圾回收(个人的理解)

August 20, 2019 · PHP · 67次阅读

今天来讲讲PHP的内存机制跟GC

相信很多PHPER,刚入门或者入门之后都没去了解过php是如何运行的,毕竟内存管理这块是php已经帮我们处理了,也是因为帮我们处理了,所以才致使PHP的简单易上手。
之前笔者学过java,那会学习的时候,老师各种讲内存,什么栈、堆、静态代码块啊、构造代码块。但是呢,虽然PHP帮我们处理了也不代表我们不应该去了解。

可能传统的PHP开发者对内存没什么概念,但是等你学到swoole,你就知道错了,因为swoole是运行到内存当中常驻内存的,不像我们传统的nginx+php-fpm,有请求就开启
一个php-fpm,请求结束就关闭。

变量的声明,都会在内存分配一块内存空间,局部变量呢,会随着代码的运行而被释放,然后有类变量呢,只有程序终止了才会被释放,比如

1.global 声明的变量
2.status 静态变量 静态方法
3.超全局变量

可能现在你可以随意用这些变量,或者静态滥用,但是等你要进阶的时候就知道了,当程序运行到内存中的时候,你们用这些了,就会造成变量无法被释放,久而久之内存就炸;
内存泄露的问题。

所以说少年啊,虽然平时还是得注意点啊。。。。

下面谈谈PHP的GC垃圾回收机制吧,其实PHP5.3之前的垃圾回收机制是“引用计数”的,就是说你声明一个变量,就分配个内存对象,产生个“引用计数”用来标识这个内存对象有没
被用到的,然后你每次引用到这块内存对象的话,引用计数就+1,当这个内存对象被断开引用,引用计数就会-1,当引用计数为0时就会,内存对象就会被是释放,触发GC垃圾回收。

但是,还有但是,这种引用计数的确有个问题,就是出现环引用的情况,就是说我一个对象或者数组,的成员变量引用我自己本身,也就说一个死循环,我自己的成员变量是我自己,
这样的情况下,内存对象的引用计数无法被减为0,这样引用计数就没用了,这块内存对象也无法被释放,就会造成内存泄露。

所以呢,在PHP5.3之后,出了新的GC垃圾回收机制,引用计数的基础上,实现了一种复杂的算法,来检测内存中的环引用的存在,解决内存泄露的问题。

至于算法嘛 说了你也不懂

顺便贴点有趣的东西吧!!!
先问个问题啊 php 执行 unset 就会释放内存吗?
贴段代码:

<?php
 error_reporting(E_ALL);
 $a = 'I am test.';
 $b = & $a;
 unset($a);
 echo $a ."\n";
 echo $b ."\n";
 ?>

结果呢是 :
echo $a 报错了
但是
echo $b 是 I am test. 为什么呢 我们明明 unset 删除啦

敲黑板 认真听 小伙伴
PS:其实unset只是删除这个变量而已,也就是说断开这个变量跟内存对象的联系,而这个内存对象跟其他变量还有联系,所以是不会触发PHP的垃圾回收的,也仅仅是引用计数-1而已

喝杯水

标签:PHP

最后编辑于:2019/08/21 19:23

添加新评论

  1. 试试 试试
    2019-08-20 16:58

    大萨达

    回复
  2. 2019-08-20 16:52

    评论1

    回复
  3. 2019-08-20 16:49

    ss

    回复

控制面板