zoukankan      html  css  js  c++  java
  • 深入理解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.

    赞赏码

    非学,无以致疑;非问,无以广识

  • 相关阅读:
    nginx源码分析:module机制
    Linux源码分析之:malloc、free
    shell格式化字符串
    shell执行字符串中的命令
    docker安装并运行mongo
    docker安装并运行kibana
    docker安装并运行elasticsearch
    docker安装并运行rabbitmq
    docker安装并运行ngnix
    docker安装并运行redis
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15452562.html
Copyright © 2011-2022 走看看