think-orm icon indicating copy to clipboard operation
think-orm copied to clipboard

4.0.7 常驻内存框架下出现内存泄漏问题

Open lnermif opened this issue 9 months ago • 6 comments

系统 windows 10 框架 Webman-framework v1.6.14 orm 4.0.7

orm从4.0.3升级到0.7版本后出现此问题

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes) in E:\www\webman\vendor\topthink\think-orm\src\Model.php on line 226
Worker process terminated with ERROR: E_ERROR "Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes) in E:\www\webman\vendor\topthink\think-orm\src\Model.php on line 226"

Model.php

    private static ?WeakMap $weakMap = null;
    private function setWeakData(string $key, string $name, $value): void
    {
        self::$weakMap[$this][$key][$name] = $value;
    }

webman里长生命周期的数组包括:

  1. static关键字的数组
  2. 单例的数组属性
  3. global关键字的数组

内存泄露问题是 在长生命周期里 无限膨胀的static数组导致

lnermif avatar Mar 26 '25 07:03 lnermif

WeakMap 里的数据在当前模型释放后 会自动释放的 是不是有什么地方导致了模型对象使用后没释放?

yunwuxin avatar Mar 26 '25 07:03 yunwuxin

@yunwuxin 模型都按照正常的使用方式来调用,不存在特殊使用方式。

lnermif avatar Mar 26 '25 08:03 lnermif

最小化检查下 模型对象的 __destruct方法有没有执行

yunwuxin avatar Mar 26 '25 08:03 yunwuxin

WeakMap 里的数据在当前模型释放后 会自动释放的 是不是有什么地方导致了模型对象使用后没释放?

按照这种说法的话,可能是用的 self 出问题了,因为 self::class 对应的是 \think\Model,只要任意模型没释放,所有模型的 $weakMap 都不会释放

big-dream avatar Mar 27 '25 01:03 big-dream

self没有问题 就是所有模型的配置信息都通过一个WeakMap变量保存在\think\Model这个类本身上 key就是各个模型对象

WeakMap的特性就是key对象被释放时对应的value也会释放掉

yunwuxin avatar Mar 27 '25 15:03 yunwuxin

我也遇到了这个问题 第一张图和第二张图为think-swoole环境 php 8.3 swoole 5.1.3 不同Model类也会相应增加weakMap的数量 关闭了APP_DEBUG = false

第三张图是nginx环境,请求结束后才会释放第一次初始化的Model Image

Image

Image

以下为测试代码:更改了一下think\Model中$weakMap的属性为protected

Image

Image

blackqing avatar Mar 28 '25 02:03 blackqing