美文网首页PHP经验分享PHP开发程序猿的进阶屋
php内存泄漏,内存溢出,垃圾回收

php内存泄漏,内存溢出,垃圾回收

作者: 程序员小饭 | 来源:发表于2020-03-25 18:19 被阅读0次

    内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

    内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

    memory leak会最终会导致out of memory!

    php-fpm 内存泄露问题

    在一台常见的 nginx + php-fpm 的服务器上:

    • nginx 服务器 fork 出 n 个子进程(worker), php-fpm 管理器 fork 出 n 个子进程。

    • 当有用户请求, nginx 的一个 worker 接收请求,并将请求抛到 socket 中。

    • php-fpm 空闲的子进程监听到 socket 中有请求,接收并处理请求。


      nginx+phpfpm.png

    一个 php-fpm 的生命周期大致是这样的:

    模块初始化(MINIT)-> 请求初始化(RINIT)-> 请求处理 -> 请求结束(RSHUTDOWN) -> 请求初始化(RINIT)-> 请求处理 -> 请求结束(RSHUTDOWN)……. 请求初始化(RINIT)-> 请求处理 -> 请求结束(RSHUTDOWN)-> 模块关闭(MSHUTDOWN)。

    在请求初始化(RINIT)-> 请求处理 -> 请求结束(RSHUTDOWN)这个“请求处理”过程是: php 读取相应的 php 文件,对其进行词法分析,生成 opcode , zend 虚拟机执行 opcode 。

    php 在每次请求结束后自动释放内存,有效避免了常见场景下内存泄露的问题,然而实际环境中因某些扩展的内存管理没有做好或者 php 代码中出现循环引用导致未能正常释放不用的资源。

    在 php-fpm 配置文件中,将pm.max_requests这个参数设置小一点。这个参数的含义是:一个 php-fpm 子进程最多处理pm.max_requests个用户请求后,就会被销毁。当一个 php-fpm 进程被销毁后,它所占用的所有内存都会被回收。

    垃圾回收

    一、概念

    垃圾回收机制是一种动态存储分配的方案。它会自动释放程序不再需要的已分配的内存块。垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻辑。在现在的流行各种语言当中,垃圾回收机制是新一代语言所共有的特征,如Python、PHP、C#、Ruby等都使用了垃圾回收机制。

    二、针对php的垃圾回收机制

    1、在PHP5.3版本之前,使用的垃圾回收机制是单纯的“引用计数”。即:

    • 每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器+1;
    • 当变量引用撤掉后(执行unset()后),计数器-1;
    • 当计数器=0时,表明内存对象没有被使用,该内存对象则进行销毁,垃圾回收完成。
    • PHP在一个生命周期结束后就会释放此进程/线程所占的内容,这种方式决定了PHP在前期不需要过多考虑内存的泄露问题。

    但是当两个或多个对象互相引用形成环状后,内存对象的计数器则不会消减为0;这时候,这一组内存对象已经没用了,但是不能回收,从而导致内存泄露的现象。

    php5.3开始,使用了新的垃圾回收机制,在引用计数基础上,实现了一种复杂的算法,来检测内存对象中引用环的存在,以避免内存泄露。

    2、随着PHP的发展,PHP开发者的增加以及其所承载的业务范围的扩大,在PHP5.3中引入了更加完善的垃圾回收机制,新的垃圾回收机制解决了无法处理循环的引用内存泄漏问题。

    垃圾回收1.png

    (tips: refcount和zval是什么?

    每个变量在PHP底层都是一个zval的结构体中保存,相同值得变量共用一个值,用refcount来保存指向这个值得变量个数,

    比如a=b=1,则他们指向一个zval,值为1,refount=2 ,表示有两个变量指向了它,详细了解见PHP内核的存储机制(分离/改变))

    垃圾回收2.png
    垃圾回收3.png

    相关文章

      网友评论

        本文标题:php内存泄漏,内存溢出,垃圾回收

        本文链接:https://www.haomeiwen.com/subject/ticzyhtx.html