4.0.7 常驻内存框架下出现内存泄漏问题
系统 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里长生命周期的数组包括:
- static关键字的数组
- 单例的数组属性
- global关键字的数组
内存泄露问题是 在长生命周期里 无限膨胀的static数组导致
WeakMap 里的数据在当前模型释放后 会自动释放的 是不是有什么地方导致了模型对象使用后没释放?
@yunwuxin 模型都按照正常的使用方式来调用,不存在特殊使用方式。
最小化检查下 模型对象的 __destruct方法有没有执行
WeakMap 里的数据在当前模型释放后 会自动释放的 是不是有什么地方导致了模型对象使用后没释放?
按照这种说法的话,可能是用的 self 出问题了,因为 self::class 对应的是 \think\Model,只要任意模型没释放,所有模型的 $weakMap 都不会释放
self没有问题 就是所有模型的配置信息都通过一个WeakMap变量保存在\think\Model这个类本身上 key就是各个模型对象
WeakMap的特性就是key对象被释放时对应的value也会释放掉
我也遇到了这个问题 第一张图和第二张图为think-swoole环境 php 8.3 swoole 5.1.3 不同Model类也会相应增加weakMap的数量 关闭了APP_DEBUG = false
第三张图是nginx环境,请求结束后才会释放第一次初始化的Model
以下为测试代码:更改了一下think\Model中$weakMap的属性为protected