基于workerman开发服务过程中发生内存泄漏的各种可能原因

问题背景:

基于workerman开发服务过程中发生内存泄漏,首先想说明的是,workerman框架本身非常稳定,不存在内存泄漏。workerman内存回收机制完全遵循PHP原有的GC机制。在workerman里业务代码都是在函数或者类方法里运行的,根据PHP的回收机制,函数或者类方法里临时变量会自动回收,所以开发时基本不用考虑内存回收问题,也不会有内存泄漏,不需要手动unset,但是下面的 "问题原因" 是必备注意事项。

可能原因:

1、业务代码有内存泄漏,比如使用了全局变量数组或者类的某个属性是数组,数组中的元素个数一直在净增加,导致内存占用越来越大。

这个场景又可以细分为:
(1)global关键字的全局变量,并且变量是数组(不是数组不用关心)
(2)static关键字的类的静态变量,并且变量是数组(不是数组不用关心)
(3)给$worker对象临时赋值的属性,比如 $worker->uidlist 这个属性是数组(不是数组不用关心)
2、使用了不稳定的或者有BUG的第三方PHP类库,类库里面同样因为问题1导致内存不断增大。
3、使用了不稳定的或者有BUG的第三方PHP扩展,这些扩展在使用过程中导致内存会不断增大。
4、业务传输数据量很大,但是客户端接收很慢,导致数据积压在内存。例如向1000人广播一个1M大小的数据包,那么最差的情况,服务器内存瞬间增加1G。这种情况可能要适当增加PHP内存限制【/path/to/php.ini中的memory_limit】,并且优化业务,避免广播巨大的数据包。
5、定时器也是用一个类的静态数组存储的,所以如果无限增加定时器又从不删除,也会导致内存泄漏。

最后修改:2019 年 08 月 28 日 07 : 55 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论