版权声明:本文为博主原创文章,可以转载但必须注明出处。    https://blog.csdn.net/nirendao/article/details/44426201
在上篇博客中,提到了对一个脚本进行的多次优化。当时以为已经优化得差不多了,但是当测试人员测试时,我才发现,踩到了Python的一个大坑。

在上文的优化中,对每500个用户,会进行一些计算并记录结果在磁盘文件中。原本以为这么做,这些结果就在磁盘文件中了,而不会再继续占用内存;但实际上,Python的大坑就是Python不会自动清理这些内存。这是由其本身实现决定的。具体原因网上多有文章介绍,这里就不copy了。

本篇博客将贴一个笔者的实验脚本,用以说明Python确实存在这么一个不释放内存的现象,然后提出一个解决方案,即:先del,再显式调用gc.collect().

脚本和具体效果见下。

实验环境一:Win 7, Python 2.7

from time import sleep, time
import gc
 
def mem(way=1):
    print time()
    for i in range(10000000):
        if way == 1:
            pass
        else:  # way 2, 3
            del i
            
    print time()
    if way == 1 or way == 2:
        pass
    else:  # way 3
        gc.collect()
    print time()
        
if __name__ == "__main__":
    print "Test way 1: just pass"
    mem(way=1)
    sleep(20)
    print "Test way 2: just del"
    mem(way=2)
    sleep(20)
    print "Test way 3: del, and then gc.collect()"
    mem(way=3)
    sleep(20)

运行结果如下:
Test way 1: just pass
1426688589.47
1426688590.25
1426688590.25
Test way 2: just del
1426688610.25
1426688611.05
1426688611.05
Test way 3: del, and then gc.collect()
1426688631.05
1426688631.85
1426688631.95

对于way 1和way 2,结果是完全一样的,程序内存消耗峰值是326772KB,在sleep 20秒时,内存实时消耗是244820KB;
对于way 3,程序内存消耗峰值同上,但是sleep时内存实时消耗就只有6336KB了。

实验环境二: Ubuntu 14.10, Python 2.7.3

运行结果:

Test way 1: just pass
1426689577.46
1426689579.41
1426689579.41
Test way 2: just del
1426689599.43
1426689601.1
1426689601.1
Test way 3: del, and then gc.collect()
1426689621.12
1426689622.8
1426689623.11

ubuntu@my_machine:~$ ps -aux | grep test_mem
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
ubuntu    9122 10.0  6.0 270916 245564 pts/1   S+   14:39   0:03 python test_mem.py
ubuntu    9134  0.0  0.0   8104   924 pts/2    S+   14:40   0:00 grep --color=auto test_mem
ubuntu@my_machine:~$ ps -aux | grep test_mem
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
ubuntu    9122 10.0  6.0 270916 245564 pts/1   S+   14:39   0:03 python test_mem.py
ubuntu    9134  0.0  0.0   8104   924 pts/2    S+   14:40   0:00 grep --color=auto test_mem
ubuntu@my_machine:~$ ps -aux | grep test_mem
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
ubuntu    9122 11.6  0.1  30956  5608 pts/1    S+   14:39   0:05 python test_mem.py

结论:

以上说明,当调用del时,其实Python并不会真正release内存,而是将其继续放在其内存池中;只有在显式调用gc.collect()时,才会真正release内存。

进一步:

其实回到上一篇博客的脚本中,也让其引入gc.collect(),然后写个监控脚本监测内存消耗情况:

while ((1)); do ps -aux | sort -n -k5,6 | grep my_script; free; sleep 5; done

结果发现:内存并不会在每500个用户一组执行完后恢复,而是一直持续消耗到仅存约70MB时,gc才好像起作用。本环境中,机器使用的是Cloud instance,总内存2G,可用内存约为1G,本脚本内存常用消耗是900M - 1G。换句话说,对于这个脚本来说,gc并没有立即起作用,而是在系统可用内存从1 - 1.2G下降到只剩70M左右时,gc才开始发挥作用。这点确实比较奇怪,不知道和该脚本是在Thread中使用的gc.collect()是否有关,或者是gc发挥作用原本就不是可控的。笔者尚未做相关实验,可能在下篇博客中继续探讨。
但是,可以肯定的是,若不使用gc.collect(), 原脚本将会将系统内存耗尽而被杀死。这一点从syslog中可以明显看出。
--------------------- 
作者:执假以为真 
来源:CSDN 
原文:https://blog.csdn.net/nirendao/article/details/44426201/ 
版权声明:本文为博主原创文章,转载请附上博文链接!

如何手动释放Python的内存相关推荐

  1. python手动回收内存哪家好_谈谈如何手动释放Python的内存

    在上篇博客中,提到了对一个脚本进行的多次优化.当时以为已经优化得差不多了,但是当测试人员测试时,我才发现,踩到了Python的一个大坑. 在上文的优化中,对每500个用户,会进行一些计算并记录结果在磁 ...

  2. 手动释放linux服务器内存

    转自 :http://blog.sina.com.cn/s/blog_4bb52a1601017ltn.html 这位朋友写的很详细 fengwei@linuxserver ~]$ free -m t ...

  3. Linux释放内存及手动释放Oracle共享内存段

    free -m #echo 3 > /proc/sys/vm/drop_caches#cat /proc/sys/vm/drop_caches3 free -m 手动删除Oracle共享内存段 ...

  4. linux清缓存命令多节点,Liunx手动释放buffers/cache内存_linux,缓存,

    最近自己开发上的一台服务器,部署了太多服务,导致了一个内存不够用的情况,在通过free命令的查看下发现cache缓存占用到了快将近700M左右,导致我不得不去释放内存. 在释放内存前我们使用sync命 ...

  5. Liunx手动释放buffers/cache内存

    最近自己开发上的一台服务器,部署了太多服务,导致了一个内存不够用的情况,在通过free命令的查看下发现cache缓存占用到了快将近700M左右,导致我不得不去释放内存. 对free命令不熟悉的请点击跳 ...

  6. linux内存cached手动释放

    总有很多朋友对于Linux的内存管理有疑问,之前一篇linux下的内存管理方式似乎也没能清除大家的疑虑.而在新版核心中,似乎对这个问题提供了新的解决方法,特转出来给大家参考一下.最后,还附上我对这方法 ...

  7. python 手动释放内存_Python手动清理内存

    写程序这方面,自己不是科班出身,本科时唯一的C语言课也没有好好听讲.导致后来写代码的时候十分不规范,也缺失了许多细节,日常遇到的自己给自己挖的坑还是有必要记录一下,方便以后复盘. 就像现在,前脚写完的 ...

  8. python内存管理和释放_《python解释器源码剖析》第17章--python的内存管理与垃圾回收...

    17.0 序 内存管理,对于python这样的动态语言是至关重要的一部分,它在很大程度上决定了python的执行效率,因为在python的运行中会创建和销毁大量的对象,这些都设计内存的管理.同理pyt ...

  9. python内存管理及释放_python的内存管理

    python的内存分配 python的内存分配主要分为4层.在Objects/obmalloc.c中的注释里画出了python的内存分配模型如下. 截图来自python代码的注释 其中第0层是库函数的 ...

  10. linux手动释放内存的方法

    Linux手动释放缓存的方法 Linux释放内存的命令: sync echo 1 > /proc/sys/vm/drop_caches drop_caches的值可以是0-3之间的数字,代表不同 ...

最新文章

  1. DRF 商城项目 - 用户操作(收藏, 留言, 收货地址)
  2. Swift3.0语言教程使用Unicode范式标准化获取字符串
  3. Druid 执行时间分布规则
  4. ASP.NET MVC3中Controller与View之间的数据传递总结
  5. java对日期进行加减操作以及比较大小
  6. 计算机软件总体上分为,山大2017春季班期末考试 信息系统B
  7. MapReduce :通过数据具有爷孙关系的结果
  8. 遥感技术在水利行业中的应用
  9. Silverlight监测工具:Silverlight Spy
  10. 用matlab求三重积分格式,matlab求三重积分
  11. [机缘参悟-6]:阳明心学三大核心思想:心外无物、知行合一、致良知的理解
  12. Windows蓝屏为什么是蓝底白字?微软程序员揭开了秘密
  13. 【眼底图像数据集】视杯 视盘分割
  14. SQL join关联三个表或多个表
  15. 做笔记就用印象笔记,支持录音做笔记(附插件下载,一键将网页内容保存笔记中进行编辑)...
  16. linux USB触屏无响应驱动出现EPIPE错误
  17. pitch yaw roll方向
  18. 【ElasticSearch基础】-- 日常查询运维操作
  19. 【OpenGL ES】透视变换原理
  20. 快解析结合友加畅捷通t1飞跃版

热门文章

  1. f5计算机中代表什么,ctrl f5是什么意思
  2. 一个草根程序员如何进入BAT
  3. Flink On K8S终极实现方案
  4. 使用excel计算空气质量指数AQI,空气质量分指数IAQI等
  5. 计算机专业知识3,计算机专业知识试卷3
  6. DEL: 华为无线modem变无线路由器 2
  7. 通过Xshell连接VM中的Ubuntu虚拟机
  8. AD158A4语音芯片介绍
  9. stack的常见用法
  10. centos8安装配置web服务器