php常驻程序内存泄露的简单解决

it2023-11-20  70

php原本设计是用了一次就丢了的,这样用基本没有内存泄露的问题,就是每次要重新构建速度会慢。

php常驻的情况内存泄露发生的概率就很高了

php主流常驻框架是解决方案也是用了就丢,但不是立刻就丢: 1·roadrunner .rr.json的配置文件

{   "http": {     "address": "127.0.2.1:80",     "workers": {       "command": "php psr-worker.php",       "pool": {         "numWorkers": 4,         "maxJobs":  4800       }     }   } }

maxJobs 4800表示接受4800个请求后,重新启新的服务代替旧的服务,旧的服务占用的内存放掉就没有问题了。

经过性能测试,相比没有重启设置,性能只损失了十分之一,完全可以接受。

2·workerman 手册里有讲如何设置workerman处理一定请求后重启当前进程

http://doc.workerman.net/faq/max-requests.html

3·swoole 手册里有讲 max_request 配置

https://wiki.swoole.com/wiki/page/p-max_request.html

处理消息队列的消费者也是常驻的,php命令行程序的解决方案也是重启。 命令行程序会一直循环处理队列的信息,我们可以让程序执行一分钟后结束,然后用定时任务每分钟重启它,用Linux-crontab或者gocron都可以,就是和队列的长连接总是要重联。  

java的话据说几个月才会一次,据阿里巴巴开发手册记载:

【推荐】给 JVM 环境参数设置-XX:+HeapDumpOnOutOfMemoryError 参数,让 JVM 碰到 OOM 场景时输出 dump 信息。 说明:OOM 的发生是有概率的,甚至相隔数月才出现一例,出错时的堆内信息对解决问题非常有帮助。

我觉得java也可以用一个月左右主动重启一次的方法来解决内存泄露的问题,使用基于反向代理的方式来实现请求不中断

python的内存泄漏问题 如果对python的一些特性不熟,就容易写出有内存泄漏的代码比如

def a(hey = [], b = 1);     hey.append(b)     return hey a() a(b=2)

 

python没有static静态变量, 但hey因为是数组, 就可以理解成静态变量 一直如上面调用的话,数组会巨大无比,直到程序崩了。

如果python能显式的声明static变量的话,就会相对容易的发现这样的代码bug。

最新回复(0)