谁动了我的内存:php内存泄露,系统缓存消耗? 转摘:http://blog.csdn.net/tao_627/article/details/9532497
http://www.laruence.com/2011/03/04/1894.html
前言:持续我一贯的标题党作风,说说例子解决方案,没有深入探讨。
情景:线上图片服务压缩的图片品质(100),缩略图品质(100)占用了很多空间,导致后来又55个文件了(占用空间160G)才发现这个问题。现在需要解决的是把这部分压缩个低品质的缩略图节省空间(当然在这个硬盘白菜价的时代搞这样的问题没这个必要,我这里讨论的不是节省空间是想找出内存消耗问题)。我用php脚本重新生成缩略图的时候,通过top发现内存消耗一直增加导致后来脚本报错内存不够了,到底谁动了我的内存?
处理代码版本一(php):
- set_time_limit(0);
- function thumbnailimage($img,$width,$height,$savefile){
- $new_img = imagecreatetruecolor ( $width, $height );
- imagedestroy($new_img);
- }
- //$list:是那个55万的文件名
- foreache($list as $v) {
- $img = imagecreatefromjpeg($v);
- thumbnailimage($img,480,300,$savepath);
- imagedestroy($img);
- }
这个脚本处理了5千多个的时候,由于内存不够用挂了,然后我改了php.ini里面的memory_limit改成了5G,但是随着脚本的执行,内存也会被消耗殆尽。
于是我就以为是php的内存泄露了,然后就想用其他方案解决,在老王的技术手册里面看到GraphicsMagick这个工具,然后写了个脚本去处理,结果发现top看到的内存消耗还是一直增加,然后经人提示这个应该是系统操作文件(写文件)文件被缓存了消耗了内存,
调整bash脚本,处理一张图片后手动释放一下内存(sync && echo 3 > /proc/sys/vm/drop_caches),然后top看到的内存消耗就正常了。
由于这个bash脚本处理的速度还不如php的gd库处理,然后就换成php处理。
验证php脚本内存消耗的原因:
处理代码版本二(php):
- set_time_limit(0);
- function thumbnailimage($img,$width,$height,$savefile){
- $new_img = imagecreatetruecolor ( $width, $height );
- ...
- imagedestroy($new_img);
- }
- //$list:是那个55万的文件名
- foreache($list as $v) {
- $memory1=memory_get_usage();
- file_put_contents('memory','memory1:'.$memory1."\n",FILE_APPEND);
- $img = imagecreatefromjpeg($v);
- thumbnailimage($img,480,300,$savepath);
- imagedestroy($img);
- $memory1=memory_get_usage();
- file_put_contents('memory','memory1:'.$memory1."\n",FILE_APPEND);
- system('sync && echo 3 > /proc/sys/vm/drop_caches');
- }
通这个版本处理内存消耗就正常了,当然php进程也要消耗内存,php.ini的memory_limit稍微改大一下。
从这里看来消耗内存的是系统操作文件消耗的,不是php,由于我的无知一开始错怪了PHP。
结尾:这个例子只是简单的描述我找到内存消耗的原因。
最后,我总结一下:
所谓的dom内存泄露或者其他php脚本的内存泄露,其实不是真正的内存泄露,因为php进程在运行时res显示项很平稳,对于used和cached的变化,那是Linux的内存管理机制在起作用。
再次感谢这两位朋友,让我解开了困扰许久的问题。
谁动了我的内存:php内存泄露,系统缓存消耗? 转摘:http://blog.csdn.net/tao_627/article/details/9532497的更多相关文章
- Volley图片加载并加入缓存处理(转自http://blog.csdn.net/viewhandkownhealth/article/details/50957024)
直接上代码 两种方式 ImageView 和NetworkImageView 如有问题或者好的建议.意见 欢迎大家加入技术群(群号: 387648673 ) 先自定义全局Application 获取 ...
- centos6.5 系统乱码解决 i18n --摘自http://blog.csdn.net/yangkai_hudong/article/details/19033393
二.终端. gedit 显示乱码 #vi /etc/sysconfig/i18n 将LANG="en_US.UTF-8" SYSFONT="latarcyrheb-sun ...
- 关于内存 转载自http://blog.csdn.net/xluren/article/details/8150723
首先感谢下原作者,写的真的非常明白,非常详细 1.预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局 ...
- 系统虚拟内存的理解 转载自http://blog.csdn.net/do2jiang/article/details/4690967
在进入正题前先来谈谈操作系统内存管理机制的发展历程,了解这些有利于我们更好的理解目前操作系统的内存管理机制. 一 早期的内存分配机制 在 早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序 ...
- 网页中通过js修改img的src属性刷新图片时,图片缓存问题现象表述及问题解决【ps:引用大神案例http://blog.csdn.net/goodleiwei/article/details/50737548】
问题:上传一张图片,通过js更新src属性刷新图片使其即时显示时, 当img的src当前的url与上次地址无变化时(只更改图片,名称不变,不同图片名称相同)图片不变化(仍显示原来的图片) 但通过fir ...
- weblogic 内存 及 内存溢出
. 区分JVM虚拟机选项:Xms Xmx PermSize MaxPermSize JVM限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制 ...
- 基于Python项目的Redis缓存消耗内存数据简单分析(附详细操作步骤)
目录 1 准备工作 2 具体实施 1 准备工作 什么是Redis? Redis:一个高性能的key-value数据库.支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使 ...
- 内存管理 & 内存优化技巧 浅析
内存管理 浅析 下列行为都会增加一个app的内存占用: 1.创建一个OC对象: 2.定义一个变量: 3.调用一个函数或者方法. 如果app占用内存过大,系统可能会强制关闭app,造成闪退现象,影响用户 ...
- 栈 堆 stack heap 堆内存 栈内存 内存分配中的堆和栈 掌握堆内存的权柄就是返回的指针 栈是面向线程的而堆是面向进程的。 new/delete and malloc/ free 指针与内存模型
小结: 1.栈内存 为什么快? Due to this nature, the process of storing and retrieving data from the stack is ver ...
随机推荐
- 二、搭建Swagger
1.新建.netCore webapi项目 2.安装swagger ,通过 Package Manager 控制台:Install-Package Swashbuckle.AspNetCore 3.修 ...
- opengl 单缓冲与双缓冲
1.说明 GLUT_SINGLE 指定单缓存窗口 GLUT_DOUBLE 指定双缓存窗口 应用程序使用单缓冲绘图时可能会存在图像闪烁的问题. 这是因为生成的图像不是一下子被绘制出来的,而是按照从左 ...
- pandas 新增数据列(直接赋值、apply,assign、分条件赋值)
# pandas新增数据列(直接赋值.apply.assign.分条件赋值) # pandas在进行数据分析时,经常需要按照一定条件创建新的数据列,然后进行进一步分析 # 1 直接赋值 # 2 df. ...
- CSP-S2019 停课日记
前言 不想上文化课,于是就停课了 (雾) \(10.13\) 停课前一天 今天名义上是放假,所以不算停课. 老师和同学们听说我要停课,都十分的不舍.我啥也没说就悄悄溜到一中来了. \(10.14\) ...
- [sql 注入] 注入类型
基于整型的注入: url:http://localhost/?id=12 拼接sql:$sql = "select * from user where id = {$_GET['id']}& ...
- python 小工具 重命名当前文件夹内所有的文件,升序命名
背景:一个朋友想升序重命名他的照片,但是太多了不想手动所以,emememem os这个模块,不用说,rename,filedir等 #conding=utf8 import os path = os. ...
- python每日练习0801
#有一堆100块的石头,2个人轮流随机从中取1-5块,谁取最后一块就谁win,编程实现 import random stones = 100 count = 0 while stones > 0 ...
- maven-enforcer-plugin查看冲突
我们会经常碰到这样的问题,在pom中引入了一个jar,里面默认依赖了其他的jar包.jar包一多的时候,我们很难确认哪些jar是我们需要的,哪些jar是冲突的.此时会出现很多莫名其妙的问题,什么类找不 ...
- LDD3 第15章 内存映射和DMA
本章内容分为三个部分: 第一部分讲述了mmap系统调用的实现过程.将设备内存直接映射到用户进程的地址空间,尽管不是所有设备都需要,但是能显著的提高设备性能. 如何跨越边界直接访问用户空间的内存页,一些 ...
- 20180823-Java包
Java 包(package) 为了更好地组织类,Java提供了包机制,用于区别类名的命名空间. 包的作用 1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2 如同文件夹一样,包 ...