内存占用

Sayings:

  最近被线上程序内存泄漏的问题搞的挺头大(程序在运行中内存占用不断的扩大),便开始看python内存垃圾回收机制、弱引用、循环引用相关的文章,着重查了一下自己的程序是不是真的有循环引用;在看的过程中写了一些demo去验证一些猜想;开篇先问三个问题

  • Linux与Windows内存回收机制是不是不同?都是如何实现的
  • Linux上不同Python版本内存释放方式是不是不同?不同的版本都更新了那些东西导致差别如此之大
  • 最重要的Python3.5中的100M做啥用了?难道是内存池占用?

长期更新中....

本文代码(main.py):

#!/usr/bin/env python
# -*- coding:utf-8 -*- import uuid
import time class Student():
def __init__(self, stuid):
self.stuid = stuid class Class():
def __init__(self, classid):
self.classid = classid
self.student = Student(uuid.uuid1()) if __name__ == '__main__':
li = []
for i in range(500000):
li.append(Class(uuid.uuid1()))
print('create instance')
time.sleep(10)
li[:] = []
print('release instance')
while True:
time.sleep(100)

  

Linux环境(centos7): 

环境:系统初始状态内存占用详情【175M/978M】

1、使用Python3.5.2执行main.py文件,内存峰值占用【556M/978M】,程序使用384M

程序等待10后,打印到‘release instance’字符串,此时内存占用【282M/978M】,程序还占用102M

理论上,li列表都已经清空,所有的class实例引用计数都应该为0,内存应该全部释放才对,但是事实却是有100M内存空间还在占用;假如把demo中循环次数加倍,那最后的内存占用也是相应扩大的;如果我们开发的程序有用到类似这种方式的话,随着使用的时间越长,生成的实例越来越多,即使我们把实例删除,计数清0,内存占用也是越来越大的,最终会导致内存占满,程序崩溃;把程序杀死之后,内存占用又回到最初的状态

那么问题是,那100M为什么没被释放? 

2、当我迟迟不能理解的时候,换了一种思路,尝试更换一下Python版本试试,会不会有不一样的状况发生;更改版本为Python3.6.2执行main.py文件,内存峰值占用【559M/978M】,与Python3.5.2基本一致

程序等待10后,打印到‘release instance’字符串时,奇迹发生此时内存占用【183M/978M】,程序占用10M(符合预期)左右,内存几乎全部释放

可以想到Python3.6.2相对于Python3.5.2肯定对内存管理进行了更新, 那么更新了什么导致差别如此的大?

3、使用Python2.7.5执行相同代码时,更为奇葩的事情发生了,内存占用更大,而且最后内存几乎没有进行释放!

内存峰值占用【880M/978M】,程序使用723M

程序等待10后,打印到‘release instance’字符串时,内存占用【822M/978M】,程序使用648M,只释放了70M左右

Windows环境(w10):

1、在pycharm上执行使用Python3.5.2执行main.py文件,程序峰值占用内存为381M

等待10后,打印到‘release instance’字符串时,内存占用8M,内存基本释放完毕

在 windows下,其他不同版本的Python结果都相似,那么windows的内存机制是否有别与linux,区别在哪?

 

Python开发【笔记】:谁偷了我的内存?的更多相关文章

  1. python开发笔记-通过xml快捷获取数据

    今天在做下python开发笔记之如何通过xml快捷获取数据,下面以调取nltk语料库为例: import nltk nltk.download() showing info https://raw.g ...

  2. python开发笔记-python调用webservice接口

    环境描述: 操作系统版本: root@9deba54adab7:/# uname -a Linux 9deba54adab7 --generic #-Ubuntu SMP Thu Dec :: UTC ...

  3. python开发笔记-Python3.7+Django2.2 Docker镜像搭建

    目标镜像环境介绍: 操作系统:ubuntu16.04 python版本:python 3.7.4 django版本:2.2 操作步骤: 1.  本地安装docker环境(略)2. 拉取ubunut指定 ...

  4. python开发笔记-类

    类的基本概念: 问题空间:问题空间是问题解决者对一个问题所达到的全部认识状态,它是由问题解决者利用问题所包含的信息和已贮存的信息主动的地构成的. 初始状态:一开始时的不完全的信息或令人不满意的状况: ...

  5. Python开发笔记之-浮点数传输

    操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 Python 版本 : 2.7.5 思路如下 : 1.将浮点数a通过内存拷贝,赋值给相同字节的整型数据b: 2.将b转换为 ...

  6. python开发笔记之zip()函数用法详解

    今天分享一篇关于python下的zip()函数用法. zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素按顺序组合成一个tuple,每个tuple中包含的是原 ...

  7. python开发笔记-ndarray方法属性详解

    Python中的数组ndarray是什么? 1.NumPy中基本的数据结构 2.所有元素是同一种类型 3.别名是array 4.利于节省内存和提高CPU计算时间 5.有丰富的函数 ndarray的创建 ...

  8. Python开发笔记之正则表达式的使用

    查找正则表达式 import re re_txt = re.compile(r'(\d)*.txt') m = re_txt.search(src) if not m == None: m.group ...

  9. Python开发笔记:网络数据抓取

    网络数据获取(爬取)分为两部分: 1.抓取(抓取网页) · urlib内建模块,特别是urlib.request · Requests第三方库(中小型网络爬虫的开发) · Scrapy框架(大型网络爬 ...

  10. python开发笔记-python-numpy

    一.Numpy概念 Numpy(Numerical Python的简称)是Python科学计算的基础包.它提供了以下功能:  除了为Python提供快速的数组处理能力,Numpy在数据分析方面还有另外 ...

随机推荐

  1. Linux ping 命令

    ping命令用来测试与目标主机的连通性,常见用法如下: [root@localhost ~]$ ping www.baidu.com # 对目标主机域名进行连通性测试 [root@localhost ...

  2. centos6.4安装 jupyter-notebook

    自上次发布了文章后有些网友就说不能实现效果,根据自己的实验发现确实有此事,那是因为版本的变化问题.这次基于yum仓库里的jupyter notebook 5.0.0版本实现: 系统:最小化安装[习惯性 ...

  3. 在线电路编程 (ICP)

    通过在线电路编程(ICP)编程Flash.如果产品在开发中,或在终端客户的产品需要固件升级,采用硬件编程模式非常困难且不方便.采用ICP方式将很简单,且不需要将微控制器从板上拆下来.ICP方式同样允许 ...

  4. URL地址重写例子(Helicon)

    # Helicon ISAPI_Rewrite configuration file# Version 3.1.0.86 #RewriteEngine on RewriteRule ^/esf/.+( ...

  5. iOS - 转场时 appear 与 disappear 的调用顺序探索

    不同的转场方式 A.B viewDidDisappear调用的流程不同 在A页面跳转到B页面的过程中 A 的 viewDidDisappear 方法和 B 的 viewDidAppear 谁先调用? ...

  6. Tomcat的目录结构和配置文件详解

    本文转载: https://www.zybuluo.com/1234567890/note/515235 参考帖子: Tomcat(一):基础配置详解 Tomcat服务器中配置多个域名,访问不同的we ...

  7. 解决nginx中fastcgi(php-fpm)60s超时的问题

    在配置中加上 location ~ .*\.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_read_timeout 700; fastcgi_ ...

  8. DELPHI XE Android 开发笔记

    第一次编译时,设定android SDK: F:\RAD Studio XE6\PlatformSDKs\adt-bundle-windows-x86-20131030\sdk F:\RAD Stud ...

  9. Qt编写百度离线版人脸识别+比对+活体检测

    在AI技术发展迅猛的今天,很多设备都希望加上人脸识别功能,好像不加上点人脸识别功能感觉不够高大上,都往人脸识别这边靠,手机刷脸解锁,刷脸支付,刷脸开门,刷脸金融,刷脸安防,是不是以后还可以刷脸匹配男女 ...

  10. 国内首款 FPGA 云服务器,性能是通用 CPU 服务器 30 倍以上

    版权声明:本文由薛梁原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/628340001485134638 来源:腾云阁 ht ...