关于PHP内存泄漏的问题
通常情况下PHP是很少发生内存泄漏这种问题的,只有在PHP内存耗尽了才会导致内存泄漏的问题出现(一般这种情况下多数都是自己代码写的有问题或者第三方请求导致的)。
查看内存占用一般有三个点需要注意:
- RSS - Resident Set Size 实际占用的物理内存(这个包含了共享内存的占用空间)
- USS - Unique Set Size 进程独自占用的物理内存(这个不包含共享内存占用的空间)
- PSS - Proportional Set Size 实际占用的物理内存(按比例分配共享库所占用的内存)
一般在查看某个进程时,可能是:
cat /proc/进程ID/status | grep RSS
如果这样查的话,所查的内存占用可能是不准的,因为RSS所占用的内存里包含了共享内存在内(共享内存会重复计算多次),从而并不是所查进程真正的内存占用值。
这个时候可以通过查看USS或PSS,[推荐使用smem指令查看] 能更加准确的查到进程实际所占用的内存值是多少,如下:
如果是想查某个程序的内存使用,例如PHP:
smem -M php | grep USS
清理内存碎片化:
有的时候,可能会遇到内存泄漏而定位不到的问题,通过工具(trace | swoole_tracker等)也可能无法定位到,但是通过smem查看内存却是一直在飙升,这很有可能就是遇到了PHP内存碎片化的问题了。
内存碎片化其实和PHP的内存分配算法有关… 大概原理是:当所申请的内存空间小于3072个字节时,PHP就会认定是一个小内存,然后PHP就会把所有的小内存给缓存起来,
即使通过使用unset()这类函数对某个变量值进行释放时,PHP也不会把释放后的空间归还于操作系统,以保证内管理的效率。
如何解决内存碎片化问题呢?PHP提供了一个函数:
gc_mem_caches()
可以调用这个函数,手动清除内存碎片化的问题。
除了用gc_mem_caches()函数外,还可以通过扩展的方式来替换PHP的内存管理模块(比如使用jemalloc)。但是目前和内存相关的算法可能都存在内存碎片化的问题。
最后:
在PHP-FPM模式下,内存泄漏一般是很少遇到的,如果真遇到了, 也可能是自己写的代码或者调用了第三方的什么组件导致的问题。
- 首先定位问题:内存泄漏的原因所在。也可以在php-fpm的配置文件里,打开php的log记录,通过log定位问题。
- 解决问题:根据具体的问题所在进行解决
- 最后如果遇到了内存碎片话问题,可以尝试用gc_mem_caches()函数,手动清除掉。
希望帮助了自己也帮到了你^_^ 有哪里不正确的,还请多多指教。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: