PHP学习心得


PHP垃圾回收机制

<h1>PHP垃圾回收机制</h1> <ul> <li><a href="https://www.jb51.net/article/163327.htm">https://www.jb51.net/article/163327.htm</a></li> </ul> <h2>垃圾回收机制</h2> <ul> <li>是一种动态存储分配的方案。</li> <li>它会自动释放程序不再需要的已分配的内存块。</li> <li>垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻辑</li> </ul> <h2>PHP5.3版本之前垃圾回收机制</h2> <ul> <li>单纯的“引用计数” <ul> <li>每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器+1;</li> <li>当变量引用撤掉后(执行unset()后),计数器-1;</li> <li>当计数器=0时,表明内存对象没有被使用,该内存对象则进行销毁,垃圾回收完成。</li> <li>PHP在一个生命周期结束后就会释放此进程/线程所占的内容,这种方式决定了PHP在前期不需要过多考虑内存的泄露问题。 </li> </ul></li> <li>但当两个或多个对象互相引用形成环状后,内存对象的计数器则不会消减为0; <ul> <li>这时,这一组内存对象已经没用了,但是不能回收,从而导致内存泄露的现象。</li> </ul></li> </ul> <h2>PHP5.3版本开始垃圾回收机制</h2> <ul> <li>在引用计数基础上,实现了一种复杂的算法,来检测内存对象中引用环的存在,以避免内存泄露。</li> <li>每个php变量存在一个叫&quot;zval&quot;的变量容器中。一个zval变量容器, <ul> <li>包含变量的类型和值,是否引用,引用数量。</li> </ul></li> </ul> <h2>使用Xdebug来检查引用计数情况</h2> <pre><code class="language-php">&lt;?php $a = "new string"; $c = $b = $a; xdebug_debug_zval( 'a' ); // a: (refcount=3, is_ref=0)='new string' unset( $b, $c ); xdebug_debug_zval( 'a' ); // a: (refcount=1, is_ref=0)='new string'</code></pre> <h2>回收周期</h2> <ul> <li>PHP垃圾回收机制默认是打开的。</li> <li>在php.ini中关闭垃圾回收机制,会有内存泄漏的风险。</li> </ul>

页面列表

ITEM_HTML