PHP内核--内存泄漏与新垃圾回收机制

时间:2022-07-15 20:57:02
垃圾回收机制是一种动态存储分配方案。它会自动释放程序不再需要的已分配的内存块。 自动回收内存的过程叫垃圾收集。垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻辑。 PHP也在语言层实现了内存的动态管理,这在前面的章节中已经有了详细的说明, 内存的动态管理将开发人员从繁琐的内存管理中解救出来。与此配套,PHP也提供了语言层的垃圾回收机制, 让程序员不必过分关心程序内存分配。 在PHP5.3版本之前,PHP只有简单的基于引用计数的垃圾回收,当一个变量的引用计数变为0时, PHP将在内存中销毁这个变量,只是这里的垃圾并不能称之为垃圾。 并且PHP在一个生命周期结束后就会释放此进程/线程所占的内容,这种方式决定了PHP在前期不需要过多考虑内存的泄露问题。 但是随着PHP的发展,PHP开发者的增加以及其所承载的业务范围的扩大。在PHP5.3中引入了更加完善的垃圾回收机制。 新的垃圾回收机制解决了无法处理循环的引用内存泄漏问题。下边,我们将配合实例测试数据,探讨一下新的垃圾回收机制。PHP内核--内存泄漏与新垃圾回收机制
(tips: refcount和zval是什么?每个变量在PHP底层都是一个zval的结构体中保存,相同值得变量共用一个值,用refcount来保存指向这个值得变量个数,比如$a=$b=1,则他们指向一个zval,值为1,refount=2 ,表示有两个变量指向了它,详细了解见PHP内核的存储机制(分离/改变))PHP内核--内存泄漏与新垃圾回收机制PHP内核--内存泄漏与新垃圾回收机制
下边是实际数据的一个测试,结论在右下角: 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