首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >深入理解PHP的GC(Garbage collection)问题「建议收藏」

深入理解PHP的GC(Garbage collection)问题「建议收藏」

作者头像
全栈程序员站长
发布2022-07-19 10:36:12
发布2022-07-19 10:36:12
7890
举报

大家好,又见面了,我是全栈君。

一.常见性能问题分类

代码语言:javascript
复制
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,

二.内存泄漏

1.内存泄漏分类

  • PHP内核层泄露: zend 引擎
  • PHP扩展层泄露: 常见, 常用valgrind检测c 语言的泄露
  • PHP代码层泄露

2.是所有程序员的噩梦,为什么FPM下没有内存泄漏一说

3.swoole 常见的内存泄露场景

请求生命周期内向全局变量对象( GLOBALS, 类的静态属性,函数的静态变量, 无法结束的函数的局部变量 )赋值并且在请求结束后没有unset释放掉,就会造成内存泄露.

4.

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/111536.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年2月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档