浅析Python3中的对象垃圾收集机制

###概述 GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来给其他对象使用。 在Python中,它在每个对象中保持了一个计数器,用于记录指向该对象的的引用的个数。一旦这个计数器为0时,则立即回收该对象,对象占用的内存空间将被释放。

引用计数

我们可以利用简单的变量引用和销毁窥见引用计数过程。

增加引用计数

增加引用计数的方式多种,即对象进行引用,那么计数器都会+1

# 创建第一个引用
a = 3
# 用其他变量名引用
b = a
# 成为一个容器的对象
L = [1, a]
# 作为参数传递
str(a)

减少引用计数

同理,以下是减少引用计数的一些方法

# 一个本地引用离开了其作用范围。比如`str()`函数结束时
str(a)
# 对象的别名被显式销毁
del a
# 对象的一个别名被复制给其他对象
a = 'Python'
# 对象从一个窗口对象中移除
L.remove(a)
# 窗口对象本身被销毁
del L

循环引用问题

什么是循环引用?A和B相互引用而再没有外部引用A与B中的任何一个,它们的引用计数虽然都为1,但显然应该被回收。

# 一个本地引用离开了其作用范围。比如`str()`函数结束时
str(a)
# 对象的别名被显式销毁
del a
# 对象的一个别名被复制给其他对象
a = 'Python'
# 对象从一个窗口对象中移除
L.remove(a)
# 窗口对象本身被销毁
del L

在这个例子中程序执行完del语句后,A、B对象已经没有任何引用指向这两个对象,但这两个对象却还各自引用这对象,虽然两个对象已经被 del 了,即我们不能再使用这两个对象,即垃圾对象,但是他们的引用计数并没有减少到零。即根据引用计数机制,他们并不会被回收,且会一直驻留在内存中,造成内存泄漏。为了解决对象的循环引用问题,而Python引入了 标记-清除 和 分代回收 两种GC机制来解决优化此问题。

总结

以上所述是小编给大家介绍的Python3中的对象垃圾收集机制,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 基于python脚本实现软件的注册功能(机器码+注册码机制)

    一.前言: 目的:完成已有python图像处理工具的注册功能 功能:用户运行程序后,通过文件自动检测认证状态,如果未经认证,就需要注册.注册过程是用户将程序运行后显示的机器码(C盘的卷序号)发回给管理员,管理员对机器码加密后生成加密文件或字符串返回给用户.每次启动程序,在有注册文件的情况下,程序就会通过DES和base64解码,并与此刻获取到的C盘卷序列号比对,如果一致则运行主程序.如果注册文件解码后与卷序号不一致,就要提醒用户输入注册码,如果对新输入的解码后和重新获取的机器码一致,则通过认证,

  • python 垃圾收集机制的实例详解

     python 垃圾收集机制的实例详解 pythonn垃圾收集方面的内容如果要细讲还是挺多的,这里只是做一个大概的概括 Python最主要和绝大多数时候用的都是引用计数,每一个PyObject定义如下: #define PyObject_HEAD \ Py_ssize_t ob_refcnt; \ struct _typeobject *ob_type; typedef struct _object { PyObject_HEAD } PyObject; 每个pyobject都有一个refcnt

  • Python中使用语句导入模块或包的机制研究

    这篇文章讨论了Python的from <module> import *和from <package> import *,它们怎么执行以及为什么使用这种语法(也许)是一个坏主意. 从一个模块导入全部 from <module> import * means意味着"我希望能访问<module>中我有权限访问的全部名称".例如以下代码something.py: # something.py public_variable = 42 _priv

  • 理解Python垃圾回收机制

    一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题. 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存. #encoding=utf-8 __author__ = 'kevinlu1010@qq.com' class ClassA(): def __init__(self): print 'object born,id:%s'%str(hex(id(self))) def __del__(self): pr

  • Python中import机制详解

    Python语言中import的使用很简单,直接使用 import module_name 语句导入即可.这里我主要写一下"import"的本质. Python官方 定义:Python code in one module gains access to the code in another module by the process of importing it. 1.定义: 模块(module):用来从逻辑(实现一个功能)上组织Python代码(变量.函数.类),本质就是*.p

  • 简单谈谈python的反射机制

    对编程语言比较熟悉的朋友,应该知道"反射"这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述python的反射机制的使用场景和核心本质. 一.前言 def f1(): print("f1是这个函数的名字!") s = "f1" print("%s是个字符串" % s) 在上面的代码中,我们必须区分两个概念,f1和"f1

  • python模拟事件触发机制详解

    本文实例为大家分享了python模拟事件触发机制的具体代码,供大家参考,具体内容如下 EventManager.py # -*- encoding: UTF-8 -*- # 系统模块 from queue import Queue, Empty from threading import * class EventManager: def __init__(self): """初始化事件管理器""" # 事件对象列表 self.__eventQu

  • 浅析Python3中的对象垃圾收集机制

    ###概述 GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来给其他对象使用. 在Python中,它在每个对象中保持了一个计数器,用于记录指向该对象的的引用的个数.一旦这个计数器为0时,则立即回收该对象,对象占用的内存空间将被释放. 引用计数 我们可以利用简单的变量引用和销毁窥见引用计数过程. 增加引用计数 增加引用计数的方式多种,即对象进行引用,那么计数器都会+1 # 创建第一个引用 a = 3 # 用其他变量名引用 b =

  • 浅析Python中字符串的intern机制

    intern机制: 字符串类型作为Python中最常用的数据类型之一,Python解释器为了提高字符串使用的效率和使用性能,做了很多优化,例如:Python解释器中使用了 intern(字符串驻留)的技术来提高字符串效率,什么是intern机制?即值同样的字符串对象仅仅会保存一份,放在一个字符串储蓄池中,是共用的,当然,肯定不能改变,这也决定了字符串必须是不可变对象. 简单原理: 实现 Intern 机制的方式非常简单,就是通过维护一个字符串储蓄池,这个池子是一个字典结构,如果字符串已经存在于池

  • 浅析JavaScript中的事件委托机制跟深浅拷贝

    今天聊下JavaScript中的事件委托跟深浅拷贝 一.事件委托 首先呢,介绍一下事件绑定 //方法一:通过onclick <button onclick="clickEvent()">点击</button> <script> function clickEvent(){ alert("点击事件"); } </script> //方法二:通过addEventListener <button id="bt

  • 深入浅析python3中的unicode和bytes问题

    最近写了一些python3程序,四处能看到bytes类型,而它并不存在于python2中,这也是python3和python2显著区别之一. 以前在写python2代码的时候,经常会遇到很多编码报错的异常,原因在于python2对unicode的支持不是特别理想.而在python3中,所有编写的代码都是unicode,python解析器在运行的时候,内部都转换(除非你显示定义为bytes类型)为unicode,减少了出错的可能性. 在python3中,有两种字符串类型,默认的就是str,即uni

  • 浅析JavaScript中的对象类型Object

    ECMAScript中的对象其实就是一组数据和功能的集合. ECMAScript中Object是所有对象的基础. 理解:Object类型是所有它的实例的基础,换句话说,Object类型所具有的任何属性和方法也同样存在于更具体的对象中. Object的实例都具有以下属性和方法 1.Constructor:保存着用于创建当前对象的函数 2.hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是原型中)是否存在.其中作为参数的属性名必须以字符串指定 3.i

  • 浅析python3中的os.path.dirname(__file__)的使用

    Python的3.0版本,常被称为Python 3000,或简称Py3k.相对于Python的早期版本,这是一个较大的升级.为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向下兼容. os.path.dirname(__file__)的作用是 返回脚本的路径,即文件路径中所在的目录(不包含文件名),如下: import os path = os.path.dirname('D:\test\t.py') print(path) 结果: D:\test Process finished

  • 浅析JS中document对象的一些重要属性

    可以通过这些属性访问到页面中的每一个元素和它们的属性,每一个标签都可以通过它们对应的数组去访问他们的属性 一: forms数组对象:代码网页中所有form标签的集合 二: anchors数组对象:指定了网页中所有指定了name或id属性的<a>标签的集合,但不包括指定了href标签的集合 三:links数组对象  指所有指定了href属性的<a>标签的集合 四:images数组对象:指定了文档中所有的<img>标签的集合 五:scripts数组对象:代表了文档中所有的&

  • 浅析C++中cout的运行机制

    复制代码 代码如下: #include <iostream>using namespace std;int hello1();int hello2(); int main() {    int a, b;    cout<<"a="<<hello1()<<" b="<<hello2()<<endl;    return 0;} int hello1(){    cout<<"

  • JS中Object对象的原型概念基础

    对象概念 在 javascript 中, 一切引用类型均为对象. 如 function Foo () {} 中,Foo本身就是一个对象的引用. 创建对象方式 字面量方式 new 构造函数函数声明 Object.create 字面量对象 javascript语言级别快速创建对象的实例 var obj = {foo: 'foo', bar: 'bar'}; // Object对象字面量 var obj2 = [obj, 'foo', 'bar']; // Array数组字面量 var obj3 =

  • 浅析Python 中整型对象存储的位置

    在 Python 整型对象所存储的位置是不同的, 有一些是一直存储在某个存储里面, 而其它的, 则在使用时开辟出空间. 说这句话的理由, 可以看看如下代码: a = 5 b = 5 a is b # True a = 500 b = 500 a is b # False 由上面的代码可知, 整型 5 是一直存在的, 而整型 500 不是一直存在的. 那么有哪些整数是一直存储的呢? a, b, c = 0, 0, 0 while a is b: i += 1 a, b = int(str(i)),

随机推荐