Page

【PHP】递归引用导致的内存无法回收问题

1014Anson21-02-14


递归引用就是自己引用自己,导致自己的引用计数为2,unset之后引用计数无法达到0,内存无法回收

1、先看正常的内存回收代码,当变量被unset之后内存就会回收

<?php
$a = range(0, 99999);

var_dump(memory_get_usage(true) / 1024 / 1024);
unset($a);
var_dump(memory_get_usage(true) / 1024 / 1024);

php5.6的结果

image.png

php7.4的结果

image.png


2、再看看递归引用导致的内存无法回收代码

<?php
$a = range(0, 99999);

var_dump(memory_get_usage(true) / 1024 / 1024);
$a[] = &$a;
unset($a);
var_dump(memory_get_usage(true) / 1024 / 1024);

php5.6

image.png

php7.4

image.png


3、结论

1)、递归引用的内存无法回收

2)、php7版本对数组底层的hashtable进行了大优化,内存占用是php5.6的一半以下



参考:https://www.php.net/manual/zh/features.gc.refcounting-basics.php


来自anson博客 

http://www.tp0.top

2021-02-14 22:52:22