内存占用

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. windows命令行下用netsh实现端口转发(端口映射)

    微软Windows的netsh是一个命令行脚本实用工具.使用netsh工具 ,可以查看或更改本地计算机或远程计算机的网络配置.不仅可以在本地计算机上运行这些命令,而且可以在网络上的远程计算机上运行. ...

  2. mssql注入指令

    and exists (select * from sysobjects) //判断是否是MSSQL and exists(select * from tableName) //判断某表是否存在..t ...

  3. VS无法导航到插入点F12失败

    关闭VS 开启控制台并导航到Visual安装文件夹,例如C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\ID ...

  4. session会话保持

    #coding=utf-8 from flask import Flask from flask import request from flask import redirect from flas ...

  5. C++ template —— 模板特化(五)

    本篇讲解模板特化-------------------------------------------------------------------------------------------- ...

  6. Eclipse cdt debug时‘Error while launching command: gdb.exe --version’

    1. 下载gdb,网上很多可以下载一个,解压放在mingw/bin下,由于该目录以在path制定,在CMD下,gdb -version会显示当前gdb版本信息. 2.按照该文档配置即可实现debug

  7. 教你在windows下安装使用配置vim+gcc[转]

    转自http://blog.163.com/lixiangqiu_9202/blog/static/535750372012461190722/ 一直在使用linux,但有时也会去虚拟机里的winxp ...

  8. codeforces水题100道 第四题 Codeforces Round #105 (Div. 2) A. Insomnia cure (math)

    题目链接:http://www.codeforces.com/problemset/problem/148/A题意:求1到d中有多少个数能被k,l,m,n中的至少一个数整出.C++代码: #inclu ...

  9. hadoop集群操作常用命令

    一.HDFS相关 1.启动NameNode sbin/hadoop-daemon.sh start namenode 2.启动DataNode sbin/hadoop-<span style=& ...

  10. 安装win7到移动硬盘

    jpg改rar http://www.360doc.com/content/16/0816/10/19373891_583556875.shtml