PHP 中如何定位内存泄露的代码所在行呢?
phper 们应该都会自动内存泄露主要由于循环应用导致的,比如如下代码将会导致内存泄露:
function fun1() { $a = ['hello']; $a[] = &$a; } func1();
自己的代码还好,可以检查检查,由于使用了第三方依赖,怎么在依赖的文件中定位到有这种有内存泄露的代码呢?小弟实在想不出有什么好的办法
phper 们应该都会自动内存泄露主要由于循环应用导致的,比如如下代码将会导致内存泄露:
function fun1() { $a = ['hello']; $a[] = &$a; } func1();
自己的代码还好,可以检查检查,由于使用了第三方依赖,怎么在依赖的文件中定位到有这种有内存泄露的代码呢?小弟实在想不出有什么好的办法
当然,实际调试的时候这些信息可能不够,需要 valgrind 。
1 <?php
2
3
4 function fun1()
5 {
6 $a = [‘hello’];
7 $a[] = &$a;
8 }
9
10 while(true) {
11 fun1();
12 gc_collect_cycles();
13 echo memory_get_usage() . “n”;
14 sleep(1);
15 }
当接上我的回答,当 php 内存达到设置值时,比如 32M 时会自动触发垃圾回收,所以没有必要手动 gc_collect_cycles();
php 7.3 之后有个 gc_status();可以看 gc 状态
“`
[email protected]:~$ cat 2.php
<?php
function fun1()
{
$a = [‘hello’];
$a[] = &$a;
}
while(true) {
var_dump(gc_status());
fun1();
var_dump(gc_status());
gc_collect_cycles();
echo memory_get_usage() . “n”;
sleep(1);
}
[email protected]:~$ ‘/home/zjsxwc/php74/bin/php’ 2.php
array(4) {
[“runs”]=>
int(0)
[“collected”]=>
int(0)
[“threshold”]=>
int(10001)
[“roots”]=>
int(0)
}
array(4) {
[“runs”]=>
int(0)
[“collected”]=>
int(0)
[“threshold”]=>
int(10001)
[“roots”]=>
int(1)
}
365496
array(4) {
[“runs”]=>
int(1)
[“collected”]=>
int(1)
[“threshold”]=>
int(10001)
[“roots”]=>
int(0)
}
array(4) {
[“runs”]=>
int(1)
[“collected”]=>
int(1)
[“threshold”]=>
int(10001)
[“roots”]=>
int(1)
}
365496
“`
PHP 的垃圾回收机制-理解 PHP 如何解决循环引用导致的内存泄漏问题
http://blog.100dos.com/2017/04/07/php-garbage-collection-collect-cycles/
请手动释放你的资源(Please release resources manually)
https://www.laruence.com/2012/07/25/2662.html