最近写一个 PHP 服务,PHP 版本为 swoole PHP 环境二进制版 7.x,其中部分逻辑涉及到把 PHP 变量写入到文件中,后续处理的时候读出来,一开始使用 serialize 和 unserialize 实现,但是运行不久就直接超内存了,最后发现是 unserialize 造成的内存泄露

例子:

测试数据: serialize 序列化字符串

[www@chengqm test]$ cat serialize_str

a:1:{s:4:"test";s:1024:"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111";}

测试数据: json 序列化字符串

[www@chengqm test]$ cat json_str

{"test":"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"}

然后是 PHP 代码,分别反序列化这两个文件的内容,前后输出内存使用情况

echo PHP_EOL;

echo 'before unserialize: ' . memory_get_usage() . PHP_EOL;

$serialize_str = file_get_contents('./serialize_str');

$array = unserialize($serialize_str);

unset($serialize_str);

unset($array);

echo 'after unset args: ' . memory_get_usage() . PHP_EOL;

echo PHP_EOL;

echo 'before decode_json: ' . memory_get_usage() . PHP_EOL;

$json_str = file_get_contents('./json_str');

$array = json_decode($serialize_str, True);

unset($json_str);

unset($array);

echo 'after unset args: ' . memory_get_usage() . PHP_EOL;

结果

[www@chengqm test]$ php-swoole test.php

before unserialize: 625048

after unset args: 625192

before decode_json: 625192

after unset args: 625192

unserialize 的某部分内存没有释放,json_decode 的已经释放了

问题: 为什么会有部分内存没有释放,是 BUG 还是 PHP 的某项特性

------------------- 问题更新 ---------------------

上面代码写错变量,重新测一下,这次没有读取文件,json_decode 放在前面

echo PHP_EOL;

echo 'before decode_json: ' . memory_get_usage() . PHP_EOL;

$json_str = '{"test":"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"}';

$array = json_decode($json_str, True);

unset($json_str);

unset($array);

echo 'after unset args: ' . memory_get_usage() . PHP_EOL;

echo PHP_EOL;

echo 'before unserialize: ' . memory_get_usage() . PHP_EOL;

$serialize_str = 'a:1:{s:4:"test";s:1024:"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111";}';

$array = unserialize($serialize_str);

unset($serialize_str);

unset($array);

echo 'after unset args: ' . memory_get_usage() . PHP_EOL;

[root@chengqm test]# php-swoole test.php

before decode_json: 627504

after unset args: 627504

before unserialize: 627504

after unset args: 627536

结果发现,unserialize后确实有一点内存没有释放(后来发现,是安装的 PHP 有问题)

然后就是测试 file_get_contents 对内存的影响

echo PHP_EOL;

echo 'before get file: ' . memory_get_usage() . PHP_EOL;

$serialize_str = file_get_contents('./serialize_str');

unset($serialize_str);

system('sync && echo 3 > /proc/sys/vm/drop_caches');

echo 'after unset args: ' . memory_get_usage() . PHP_EOL;

[root@chengqm test]# php-swoole test.php

before get file: 624304

after unset args: 624416

结果发现, file_get_contents 也会造成内存增长

会产生php7内存泄露,为什么 PHP unserialize 会有内存泄露相关推荐

  1. python 单例模式内存泄露_彻底搞懂Java内存泄露

    之前一直在简书写作,第一次发布到SF上来,也是第一次使用SF,后面会尽量同步到SF,更多文章请关注: 简书 编程之乐 转载请注明出处:谢谢! Java内存回收方式 Java判断对象是否可以回收使用的而 ...

  2. c++ thread 内存泄漏_使用 ThreadLocal如何避免内存泄露?

    作者:鲁毅 juejin.im/post/5e0d8765f265da5d332cde44 1.ThreadLocal的使用场景 1.1 场景1 每个线程需要一个独享对象(通常是工具类,典型需要使用的 ...

  3. SQL Server 内存泄露(memory leak)——游标导致的内存问题

    原文:SQL Server 内存泄露(memory leak)--游标导致的内存问题 转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/07/01/sql ...

  4. js垃圾回收机制,内存泄露和内存溢出,解决闭包产生的内存泄露详解

    一.内存的周期和回收机制 分配内存----->使用内存----->释放内存 1.JS 环境中分配的内存有如下声明周期: 内存分配:当我们声明变量.函数.对象的时候,系统会自动为他们分配内存 ...

  5. 什么是内存溢出与内存泄露,几种常见导致内存泄露的写法

    最近朋友推荐了一篇关于内存溢出与内存泄漏的文章,感觉写的还不错,于是便在网上搜索了一番,对这块进行了加固,发现自己之前写的代码也存在一些内存泄漏的风险,所以弄懂内存泄漏与内存溢出是很有利于我们提高代码 ...

  6. python会不会内存泄露_记一次python 内存泄漏问题及解决过程 python 嵌套读取文件 内存泄露...

    如何解决Python2的内存泄漏问题 python本身不会造成内存泄露,如果用的C/C++写的模块(包),如果处理不好,可能会造成内存泄露,但是也是C/C++的模块造成的 欢迎来到四十五资源网,pyt ...

  7. java byte 释放内存_java java.nio.ByteBuffer.allocateDirect 导致内存泄露

    java能够经过java.nio.ByteBuffer.allocateDirect(capacity)直接运用non java heap(java堆外)的内存 . 一.运用意图: 1.拓荒数据缓冲区 ...

  8. 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  9. vs使用未初始化的内存怎么解决_遇到C语言内存错误怎么办?一定要找准这六个原因...

    一.没有为指针分配内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内存.浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.结构体成员指针未初始化 struct student ...

最新文章

  1. python 图表_Python入门学习系列——使用Python调用Web API实现图表统计
  2. autoware使用激光雷达进行目标检测(五)
  3. hdu 3666 THE MATRIX PROBLEM
  4. 【软考-软件设计师】数据表示
  5. boost::safe_numerics::automatic相关的测试程序
  6. Redis基础数据结构内部实现简单介绍
  7. struct作为map的key时,需要重载该结构体
  8. ADO.NET- 基础总结及实例
  9. 透视变换--图像拼接
  10. Shell命令-系统信息及显示之dmesg、uptime
  11. 数据结构思维 第三章 `ArrayList`
  12. 《架构漫谈》阅读感想
  13. Script:查找表或索引增长的历史信息
  14. 基于阿里云上实现全站https
  15. Mac电脑上非常好用的英汉互译词典软件
  16. [转载]内存管理与TLB
  17. 【概率论与数理统计】-排列组合笔试题汇总
  18. SuperMap GIS地质体数据处理QA
  19. C++嵌套类的使用及对外部类的访问权限
  20. 10月14日笔记交叉开发开发板连接,远程登录和tftp服务器配置

热门文章

  1. 【示例】Lucene查询索引库编程步骤
  2. AngularJS集合数据遍历显示
  3. 下载python需要注意什么_用户在对Python下载的时候,这些注意事项不能忽视
  4. 多个vue项目合并成一个_集美们,快看如何一步将多个PDF合并成一个PDF
  5. IDEA中添加tomcat服务器和创建一个新的web项目
  6. 关于静态局部全局变量
  7. mysql 测试快生产慢_生产上MySQL慢查询优化实战,SQL优化实战
  8. 台式电脑耳机插孔在哪_不到一千元的迷你电脑究竟如何?Intel NUC7CJYH测评来了...
  9. kafka 不同分区文件存储_Kafka文件存储机制思考及答案:为什么要分区呢?分区存了哪些内容?...
  10. Arduino--AS608指纹传感器