垃圾回收机制是一种动态存储分配方案。它会自动释放程序不再需要的已分配的内存块。 自动回收内存的过程叫垃圾收集。垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻辑。
PHP也在语言层实现了内存的动态管理,这在前面的章节中已经有了详细的说明, 内存的动态管理将开发人员从繁琐的内存管理中解救出来。与此配套,PHP也提供了语言层的垃圾回收机制, 让程序员不必过分关心程序内存分配。
在PHP5.3版本之前,PHP只有简单的基于引用计数的垃圾回收,当一个变量的引用计数变为0时, PHP将在内存中销毁这个变量,只是这里的垃圾并不能称之为垃圾。 并且PHP在一个生命周期结束后就会释放此进程/线程所占的内容,这种方式决定了PHP在前期不需要过多考虑内存的泄露问题。 但是随着PHP的发展,PHP开发者的增加以及其所承载的业务范围的扩大。
在PHP5.3中引入了更加完善的垃圾回收机制。 新的垃圾回收机制解决了无法处理循环的引用内存泄漏问题。下边,我们将配合实例测试数据,探讨一下新的垃圾回收机制。
(tips: refcount和zval是什么?
每个变量在PHP底层都是一个zval的结构体中保存,相同值得变量共用一个值,用refcount来保存指向这个值得变量个数,
比如$a=$b=1,则他们指向一个zval,值为1,refount=2 ,表示有两个变量指向了它,详细了解见PHP内核的存储机制(分离/改变))
阿
下边是实际数据的一个测试,结论在右下角:
如何避免内存泄露:
1. 写高质量代码,减少内存泄漏的可能
2.根据PHP生命周期回收,让系统自动回收内存(对于非常驻行程序有效,RINIT ,RSHOTDOWN)
3.手动回收,即重启服务器nginx或apache (MINIT ,MSHOTDOWN)
4.调高php.ini配置文件: php.ini memory_limit = 128M(不推荐)
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 38218371 bytes) 128MB = 134217728byte
Atas ialah kandungan terperinci PHP内核-内存泄漏与新垃圾回收机制的图文介绍. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!