首页 > 编程语言 >python的垃圾回收机制

python的垃圾回收机制

时间:2022-11-12 23:11:35浏览次数:54  
标签:v1 python 回收 对象 计数器 垃圾 引用

python对内存回收引用几个概念

计数器:当python程序运行时,会根据数据类型的不同找到相对应的结构体,根据结构体中的字段来进行创建相关的数据。然后将对象添加到refchain双向链表中。每个对象中有ob_refcnt就是计数器。默认值为1,当有其他变量引用对象时,引用计数器就会发生变化

a=999
b=a      #a对象的计数器此时从1变为2,因为b引用一次a
del b      #b变量删除,b对应对象引用的计数器值-1
del a     #a变量删除,a对应对象引用的计数器值-1
当一个对象引用的计数器为0时,意味着没有人使用这个变量,此时将该对象进行垃圾回收,首先先将该对象从refchain双向链表中移除,最后将该对象进行销毁,释放内存

 

标记清除:

但是在python中会存在循环引用的情况,为了解决这个问题,python引用了标记清除的概念

v1=[1,2,3]
v2=[4,5,6]
v1.append(v2)      #此时v1计数器值为2
v2.append(v1)     #此时v2计数器值为2
del v1          #删除后,v1计数器值为1,并不为0,导致不会将该对象清除,所以内存不被释放,这就是计数器循环引用的问题
del v2

标记清除(Mark—Sweep)算法是一种基于追踪回收(tracing GC)技术实现的垃圾回收算法。它分为两个阶段:第一阶段是标记阶段,GC会把所有的活动对象打上标记,第二阶段是把那些没有标记的对象非活动对象进行回收。

分代回收:

分代回收是建立在标记清除技术基础之上的,是一种以空间换时间的操作方式。Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为了3“代”,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代),他们对应的是3个链表,它们的垃圾收集频率与对象的存活时间的增大而减小。新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,依此类推,老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。

标签:v1,python,回收,对象,计数器,垃圾,引用
From: https://www.cnblogs.com/powfu/p/16884970.html

相关文章

  • python学习笔记(一)
    一、前言要开始准备明年的数学建模比赛了,第一次弄这个比赛先从python学习开始吧,正好学了c语言,感觉大部分都差不多。 二、基础语法有三个非常基础的语法,据我所知c中并......
  • python的深浅拷贝
    在python中,对象的赋值就是简单的引用,a=[1,2,3],b=a,在上述情况下,a和b是一样的,他们指向同一片内存,b不过是a的别名,是引用,我们可以使用bisa去判断,返回Trueb......
  • Python_解决脚本执行过程中,文件被多次读取的问题
    今天在封装pandas过程中,发现封装脚本的执行耗时明显高于未封装的脚本复盘问题importtimeclassDemo:defmock_read_excel(self):print("读取文件")......
  • Python程序流程控制
    Python程序流程控制1.*程序流程概述在现实生活中,我们看到的流程是多种多样的,如汽车在道路上行驶,要顺序地沿道路前进,碰到交叉路口时,驾驶员就需要判断是转弯还是直行,在环......
  • 万万没想到,除了香农计划,Python3.11竟还有这么多性能提升!
    众所周知,Python3.11版本带来了较大的性能提升,但是,它具体在哪些方面上得到了优化呢?除了著名的“香农计划”外,它还包含哪些与性能相关的优化呢?本文将带你一探究竟!作者:Bes......
  • 30分钟学完Python基础语法
    30分钟学完Python基础语法,有一门面向对象语言的基础,30分钟足够看一遍Python的基础了。基础语法#缩进取代大括号#用换行取代分号,也可以使用分号,无所谓#输出print();#输......
  • python函数
    一、定义函数下面是一个打印问候语的简单函数,名为greet_user()1、向函数传递信息通过在这里添加username,就可让函数接受你给username指定的任何值。现在,这个函数要......
  • Python字符串操作
    Python字符串操作1.*字符串的常用操作1.*.&访问字符串中的值Python访问子字符串变量,可以使用方括号来截取字符串。与列表的索引一样,字符串索引从0开始。字符串的索引......
  • Python3.8多进程共享内存之Numpy数组
    在利用python处理数据的时候,想要充分发挥CPU的算力,可以选择利用多进程来实现。如果子进程内存占用较大的话,往往很难多开进程,如果不涉及对内存的写入操作,那么多个子进程共享......
  • 2.IPython 的使用技巧
    二.  IPython的使用技巧通过命令来获得帮助文档   1.使用help()#示例help(len)  2.使用?#示例len?  3.shift+tab 查看文档#示例len()......