深入理解PHP的GC(Garbage collection)问题
一.常见性能问题分类
class ClassA
{
public $pro;
}
function foo()
{
// 堆:堆上内存跟函数生命周期没关系,函数结束后仍然占内存,堆上垃圾自动释放
// 栈:函数结束后内存释放掉
//java: 分带回收
//php; 引用计数
$i = 100000;
while ($i--) {
$var = new ClassA();
$var->pro = $var;
unset($var);
}
}
function foo2(){
for ($a=1;$a<100000;$a++){
// gc_disable();//停用循环引用收集器
$var2=new ClassA();
$var2->pro=$var2;
unset($var2);
}
}
foo2();
1.什么是垃圾回收?什么是循环引用?
循环引用:自己引用自己,
堆栈:两种内存的管理方式,
PHP的gc是用来解决循环引用内存泄露问题的.
2.为什么说GC问题是避免不了的,什么又是无用GC,怎么发现/解决代码中存在的GC问题, GC又占用了多少CPU
(1)怎么发现/解决代码中存在的GC问题
(2)无用gc: 浪费cpu但没起任何作用, 代码中将变量$var 赋值给全局变量$_GLOBALS, $var 引用了计数为1,进入垃圾池中.
二.内存泄漏
1.内存泄漏分类
- PHP内核层泄露: zend 引擎
- PHP扩展层泄露: 常见, 常用valgrind检测c 语言的泄露
- PHP代码层泄露
2.是所有程序员的噩梦,为什么FPM下没有内存泄漏一说
3.swoole 常见的内存泄露场景
请求生命周期内向全局变量对象( GLOBALS, 类的静态属性,函数的静态变量, 无法结束的函数的局部变量 )赋值并且在请求结束后没有unset释放掉,就会造成内存泄露.
4.
赞赏码
非学,无以致疑;非问,无以广识