谁动了我的内存: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 ...
随机推荐
- 解决pycharm运行py文件时只有unittest选项的方法
有时候在编完脚本开始运行时,发现某个py脚本右键运行的选项不是run,二是run in unittest,试过很多方法都不能很好的去除,主要是因为脚本中含有test字符串,一种解决方法是将脚本中所有的 ...
- 外媒:Apple面临着印度iPhone的停用
据外媒报道:印度电信管理局(TRAI)制定遏制令人讨厌的消息的新规则可能导致印度数百万部iPhone的停用. 该监管机构本周早些时候宣布了“2018年电信商业通信客户偏好规定”,根据该规定,它已提议“ ...
- redis专题
1.Linux安装redis 2.redis持久化 3.redis配置 4.SpringBoot整合Redis发布订阅 5.redis事务 5.1.redis事务介绍 5.2. redisTempla ...
- 修改Win7登陆界面墙纸
修改Win7登陆界面墙纸 修改注册表.reg Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\W ...
- ht-6 hashSet特性
Set接口: Set接口是Collection接口的另外一个常用子接口,Set接口描述的是一种比较简单的集合,集合中的对象并不按特定的方式排序,并且不能保存重复的对象,即set接口可以存储一组唯一的无 ...
- java中super的用法总结
package com.ssm.java; /** * Super * usage1:super. 直接去调用父类的方法和属性. * usage2:放在构造器中的第一位,代表引用父类的构造器. */ ...
- js常见的几种设计模式
一.单例模式 单例模式也称作为单子模式,更多的也叫做单体模式.为软件设计中较为简单但是最为常用的一种设计模式. 在JavaScript里,实现单例的方式有很多种,其中最简单的一个方式是使用对象字面量的 ...
- CF 1182F Maximum Sine——根号算法
题目:http://codeforces.com/contest/1182/problem/F 注意有绝对值. 那么就是 k*p 对 q 取模,找最接近 \(\frac{q}{2}\) 的结果. 也就 ...
- [CSP-S模拟测试]:X国的军队(贪心)
题目描述 $X$国和$Y$国开战了! 作为$X$国的军事参谋,你了解到事态的严峻性.为了更好地应付敌人,你收集到了$Y$国城市中$n$个据点的信息,你打算攻破这$n$个据点! 每个据点$i$的信息由火 ...
- 添加对象到 HashSet 里的规则是
下面的解释取自百度知道的一位网友的回答,链接如下: java HashSet类添加元素的问题_百度知道http://zhidao.baidu.com/link?url=9bcAnolev1EBeFI_ ...