python回收机制

目录

  • Python的垃圾回收机制
    • 引子:
    • 一、什么是垃圾回收机制?
    • 二、为什么要用垃圾回收机制?
    • 三、垃圾回收机制原理分析
      • 1、什么是引用计数?
      • 2、引用计数扩展阅读?(折叠)

Python的垃圾回收机制

引子:

我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,而变量名是访问到变量值的唯一方式,所以当一个变量值没有关联任何变量名时,我们就无法再访问到该变量值了,该变量值就是一个垃圾会被Python解释的垃圾回收机制自动回收。。。

一、什么是垃圾回收机制?

垃圾回收机制(简称GC)是Python解释器自带一种机,专门用来回收不可用的变量值所占用的内存空间

二、为什么要用垃圾回收机制?

1程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间如果不及时清理的话会导致内存使用殆尽(内存溢出),导致程序崩溃,因此管理内存是一件重要且繁杂的事情,而python解释器自带的垃圾回收机制把程序员从繁杂的内存管理中解放出来。

三、垃圾回收机制原理分析

Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾。在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用的问题,并且通过“分代回收”(generation collection)以空间换取时间的方式来进一步提高垃圾回收的效率。

1、什么是引用计数?

引用计数就是:变量值被变量名关联的次数

如:name=‘jason'

变量值jason被关联了一个name,称之为引用计数为1

引用计数增加:

x=10 (此时,变量值10的引用计数为1)

y=x (此时,把x的内存地址给了y,此时,x,y都关联了10,所以变量值10的引用计数为2)

引用计数减少:

x=3(此时,x与10解除了关联,与3 建立了关联,变量10的引用计数为1)

del y(del的意思是解除变量名y与变量值10的关联关系,此时,变量10的引用计数为0)

这样变量值10的引用计数为0,其占用的内存地址就会被回收

2、引用计数扩展阅读?(折叠)

引用计数机制执行效率问题:变量值被关联次数的增加或减少,都会引发引用计数机制的执行,这存在明显的效率问题
如果说执行效率还仅仅是引用计数机制的一个软肋的话,那么很不幸,引用计数机制还存在着一个致命的弱点,即循环引用(也称交叉引用)。

# 变量名l1指向列表1,变量名l2指向列表2,如下
>>> l1=['列表1中的第一个元素']  # 列表1被引用一次   
>>> l2=['列表2中的第一个元素']  # 列表2被引用一次 
>>> l1.append(l2)             # 把列表2追加到l1中作为第二个元素,列表2的引用计数为2
>>> l2.append(l1)             # 把列表1追加到l2中作为第二个元素,列表1的引用计数为2
# l1与l2
# l1 = ['列表1中的第一个元素',列表2的内存地址]
# l2 = ['列表2中的第一个元素',列表1的内存地址]

循环引用可以使一组对象的引用计数不为0,然而这些对象实际上并没有被任何外部对象所引用,它们之间只是相互引用。这意味着不会再有人使用这组对象,应该回收这组对象所占用的内存空间,然后由于相互引用的存在,每一个对象的引用计数都不为0,因此这些对象所占用的内存永远不会被释放。比如:

>>> l1
['列表1中的第一个元素', ['列表2中的第一个元素', [...]]]
>>> l2
['列表2中的第一个元素', ['列表1中的第一个元素', [...]]]
>>> l1[1][1][0]
'列表1中的第一个元素'

如果我们执行del l1,列表1的引用计数=2-1,即列表1不会被回收,同理del l2,列表2的引用计数=2-1,此时无论列表1还是列表2都没有任何名字关联,但是引用计数均不为0,所以循环引用是致命的,这与手动进行内存管理所产生的内存泄露毫无区别
要解决这个问题,Python引入了其他的垃圾收集机制来弥补引用计数的缺陷:1、“标记-清除” 2、“分代回收”

标记-清除

容器对象(比如:list,set,dict,class,instance)都可以包含对其他对象的引用,所以都可能产生循环引用。而“标记-清除”计数就是为了解决循环引用的问题。

在了解标记清除算法前,我们需要明确一点,内存中有两块区域:堆区与栈区,在定义变量时,变量名存放于栈区,变量值存放于堆区,内存管理回收的则是堆区的内容,详解如下图

标记/清除算法的做法是当有效内存空间被耗尽的时候,就会停止整个程序,然后进行两项工作,第一项则是标记,第二项则是清除

标记:标记的过程其实就是,遍历所有的GC Roots对象(栈区中的所有内容或者线程都可以作为GC Roots对象),然后将所有GC Roots的对象可以直接或间接访问到的对象标记为存活的对象。

清除:清除的过程将遍历堆中所有的对象,将没有标记的对象全部清除掉。

GC roots对象直接访问到的对象,插图如下

GC roots对象间接访问到的对象,插图如下

用图形解释,环引用的例子中的l1与l2,在什么时候启动标记清除,标记清除的整个过程,插图

分代回收

背景:

基于引用计数的回收机制,每次回收内存,都需要把所有对象的引用计数都遍历一遍,这是非常消耗时间的,于是引入了分代回收来提高回收效率,采用“空间换时间的策略”。

什么是分代回收?

分代:

分代回收的核心思想是:在多次扫描的情况下,都没有被回收的变量,gc机制就会认为,该变量是常用变量,gc对其扫描的频率会降低,具体实现原理如下:

分代指的是根据存活时间来为变量划分不同等级(也就是不同的代)

新定义的变量,放到新生代这个等级中,假设每隔1分钟扫描新生代一次,如果发现变量依然被引用,那么该对象的权重(权重本质就是个整数)加一,当变量的权重大于某个设定得值(假设为3),会将它移动到更高一级的青春代,青春代的gc扫描的频率低于新生代(扫描时间间隔更长),假设5分钟扫描青春代一次,这样每次gc需要扫描的变量的总个数就变少了,节省了扫描的总时间,接下来,青春代中的对象,也会以同样的方式被移动到老年代中。也就是等级(代)越高,被垃圾回收机制扫描的频率越低

回收:

回收依然是使用引用计数作为回收的依据

画图:

缺点:

例如一个变量刚刚从新生代移入青春代,该变量的绑定关系就解除了,该变量应该被回收,青春代的扫描频率低于新生代,所以该变量的回收时间被延迟。

转载于:https://www.cnblogs.com/liushen1995/p/10385528.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装openssl-devel命令

centos: yum install openssl-devel ubuntu: sudo apt-get install openssl sudo apt-get install libssl-dev

阿里云天池 Python训练营Task2: Python基础练习:数据结构大汇总 学习笔记

本学习笔记为阿里云天池龙珠计划Python训练营的学习内容,学习链接为:https://tianchi.aliyun.com/specials/promotion/aicamppython?spm5176.22758685.J_6770933040.1.6f103da1tESyzu 目录 一、学习知识点概要 二、学习内容 I.列表(list…

windows文件与Linux文件互转

使用命令 unix2dos filename dos2unix filename

1G.小a的排列(C++)

小a的排列(C) 点击做题网站链接 题目描述 小a有一个长度为n的排列。定义一段区间是"萌"的,当且仅当把区间中各个数排序后相邻元素的差为1现在他想知道包含数x,y的长度最小的"萌"区间的左右端点 也就是说,我们…

阿里云天池 Python训练营Task3: Python基础进阶:从函数到高级魔法方法 学习笔记

本学习笔记为阿里云天池龙珠计划Python训练营的学习内容,学习链接为:https://tianchi.aliyun.com/specials/promotion/aicamppython?spm5176.22758685.J_6770933040.1.6f103da1tESyzu 目录 一、学习知识点概要 二、学习内容 I.函数 1.定义自己的函…

C# 获取句柄程序

这个小程序需要用到系统API,也就是需要用到user32中的三个函数。 第一个:WindowFromPoint 返回一个窗口句柄 第二个:GetWindowText 获取窗口标题 第三个:GetClassName 获取类名 当然,最重要的一点就是要引用命名空间…

HBase安装配置

HBase的安装配置: 4台主机:hdp0 hdp1 hdp2 hdp3 hdp0 hdp1 跑HMaster hdp2 hdp3 跑HRegionServer 将HBase解压之后 1、确保安装ZooKeeper; 2、修改hbase-env.sh export JAVA_HOME/.../jdk export HBASE_MANAGES_ZKfalse //使用外部的…

python cook读书笔记第2章字符串和文本

使用多个界定符分割字符串 line asdf fjdk; afed, fjek,asdf, fooimport re# line re.split(r[;,\s]\s*,line)# print(line)# [asdf, fjdk, afed, fjek, asdf, foo]"""当你使用 re.split() 函数时候,需要特别注意的是正则表达式中是否包含一个括号…

centos7安装oracle12c 一

本文 基本参考了下面这篇文章http://blog.csdn.net/gq5251/article/details/42004035 和http://www.linuxidc.com/Linux/2017-08/146528.htm 但是改正了一些错误操作系统:CentOS Linux release 7.2.1511 (Core) oracle: oarcle (12.1.0.2.0) - Standard Edition (SE2)几点要注…

Bigtable的些许重点

分布式数据库系统 针对于海量数据,可扩展,高吞吐量,低时延 不支持关系模型 通过row和column进行索引,row和column可以是任意字符串 所存储的数据也是字符串 Bigtable是一个map,value是array of bytes,通…

阿里云天池 Python训练营Task4: Python数据分析:从0完成一个数据分析实战 学习笔记

本学习笔记为阿里云天池龙珠计划Python训练营的学习内容,学习链接为:https://tianchi.aliyun.com/specials/promotion/aicamppython?spm5176.22758685.J_6770933040.1.6f103da1tESyzu 一、学习知识点概要 本次主要通过阿里云天池的赛题【Python入门系…

JMETER从JSON响应中提取数据

如果你在这里,可能是因为你需要使用JMeter从Json响应中提取变量。 好消息!您正在掌握掌握JMeter Json Extractor的权威指南。作为Rest API测试指南的补充,您将学习掌握Json Path Expressions 所需的一切。 我们走吧!并且不要惊慌&…

centos7安装oracle12c 二

环境:CentOS7VMware12,分配资源:CPU:2颗,内存:4GB,硬盘空间:30GB Oracle 12C企业版64位 下载地址:http://www.oracle.com/technetwork/database/enterprise-edition/down…

阿里云天池 Python训练营Task5:Python训练营测试 学习笔记

一、学习知识点概要 本次是Python训练营的测试,在45分钟内完成25题,满分100分及格80分。题目主要考察Task1到Task3里面的Python基础知识。在我随到的25道题里,知识点有: 变量(包括数据类型和容器类型)运算…

centos7安装oracle12c 三

场景描述:我在自己电脑的虚拟机上linux环境下安装oracle11g数据库。 Linux版本为:CentOS release 6.8 (Final),Oracle版本为:linux.x64_11gR2 问题描述:在oracle安装到Prerequisite Checks这一步的时候,出现…

mysql删除一条记录

mysql如何删除一条记录delete from 表名 where 条件实例:use db1delete from tb1 where id 1; 转载于:https://www.cnblogs.com/effortsing/p/10393229.html

HBase体系结构

HBase HBase是Apache Hadoop的数据库,基于HDFS文件系统 random,realtime read/write access to Big Data 开源、分布式、可扩展、面向列 larger tables--billions of rows X millions of columns 不支持表链接操作 不支持事务处理 HBase存储的数据从逻辑上来…

《属性数据分析引论》 部分课后习题R语言实践(第三章、第四章)

目录 前言 第三章 广义线性模型 习题3.18 a小题 b小题 c小题 d小题 习题3.19 a小题 b小题 c小题 第四章 Logistic回归 习题4.1 a小题 b小题 c小题 d小题 e小题 习题4.2 a小题 b小题 c小题 d小题 小结 前言 习题选自高等教育出版社译制,Alan A…

Linux下SVN搭建

在Linux系统中搭建svn服务所需要用到的软件叫做subversion,可以通过yum来进行安装,如图 安装好软件后第一件事就是创建一个仓库目录 [rootserver1 ~]# mkdir /svn 使用svn自带命令建立仓库 [rootserver1 ~]# svnadmin create /svn 进入该仓库&#xff0c…

HBase模式设计

HBase的使用是为了解决或优化某一问题 恰当的设计模式可以使其具有HBase本身所不具有的功能,并且使其执行效率得到成百上千倍的提高 在进行HBase数据库模式设计的时候,不当的设置可能对系统的性能产生不良的影响 需要注意: 1、列族的数量及…