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

python垃圾回收机制

时间:2022-11-16 17:24:48浏览次数:39  
标签:python 回收 链表 计数 对象 垃圾 引用

python垃圾回收机制主要分为:
    1. 引用计数
    2. 标记清除
    3. 分代回收

python的引用计数机制:
python是根据对象的引用计数是否为0,来进行垃圾回收,释放内存的

引用计数增加的几种情况:
1、对象创建被赋值给变量
2、对象被其他的变量引用(引用它的变量赋值给了其他变量)
3、当对象被当成参数传入函数中
4、对象被放到其他的容器中(或者保存为其他对象的属性)

引用计数减少的几种情况:
1、保存对象的变量被删除
2、引用该对象的变量被重新赋值,引用了其他的对象
3、被当成函数参数传入函数中,当函数调用结束
4、对象从容器中删除(保存对的属性被删除)


sys.getrefcount查看当前序列的的引计数:
import sys

a = {"aa": 1}
b = a
c = [11, 22, a]
print("1查看对象的引用计数:", sys.getrefcount(b))

# 1查看对象的引用计数: 4
sys.getrefcount查看int整数str类型的引计数:
a = 0
b = "a"
print("查看对象a的引用计数:", sys.getrefcount(a))
print("查看对象b的引用计数:", sys.getrefcount(b))

结果:
查看对象a的引用计数: 174
查看对象b的引用计数: 9

分析当中结果:  我们当前a和b只引用了两次为什么引计数不是2呢?这是因为当前的python针对长引用的值做了对应的优化处理

那就是 小整数池,和字符串驻留池

小整数池:

1、小整数池:     对象咱们python中 -5 到256之间的整数,python做了优化处理     在运行python程序时,python会自动将开辟一块内存将-5 到256之间的整数对象全部创建好,加入一个小整数池中     意义:为了避免python程序频繁申请内存和回收释放内存,对于常用的整数(-5 到256)python开发团队而设计的优     化机制,在引用这些整数的过程当中,会直接去小整数池当中取值, 例: 可以看到 a和b的值都是5,打印的内存都是同一个值.

a = 5 b = 5 print(id(a),id(b)) # 结果: 2064409760 2064409760

 

2、字符串驻留池:     对于python程序中 纯单词字符(数字、字母、下划线)组成的字符串,python也进行了优化     在运行python程序时,创建纯单词字符组成的字符串会加入到字符串驻留池中,当再次创建相同的字符串时,直接     引用字符串驻留池中的   例: 可以看到 a和b的值都是"abc",打印的内存都是同一个值.
a = "abc"
b = "abc"
print(id(a),id(b))
# 结果: 30597984 30597984

 

 

标记清除:     引用计数存在一个缺点那就是当两个对象出现循环引用的时候,那么这个两个变量始终不会被销毁,这样就会导致内存泄漏,     标记清除就是为了解决上述循环引用的情况
#第一组循环引用#
a = [1,2]
b = [3,4]
a.append(b)
b.append(a)
del a

    标记清除:      他先划分出两拨,一拨叫(存活组),一拨叫死亡组)。然后,他把各个对象的引用计数复制出来,对这个副本进行引用环的摘除。

    分代回收:   
import gc
print(gc.get_threshold()) 可以通过gc模块来看下分代回收的机制:
输出结果:(700,10,10)

  1.在回收的过程当中也是通过标记的方法,将需要被删除的垃圾放入回收链表进行pyhton的垃圾回收

  2.在python当中并不是一直循环去回收垃圾的,而是通过分代回收总共分为三个链表容器: 当第0代链表的对象达到700个对象的时候,python   开始回收垃圾,一些还被引用的数,则放入下一个链表容器当中,当第零代链表执行10次之后,第一代链表开始进行回收垃圾,未被回收的垃圾   则放入第二代链表当中,当第一代链表容器回收10次之后我第二代链表开始回收操作.  


标签:python,回收,链表,计数,对象,垃圾,引用
From: https://www.cnblogs.com/manxingsir/p/16896594.html

相关文章

  • python的文件操作
    步骤1、打开文件:使用内置函数open2、进行操作(读或者写)读:read方法或者写:write方法3、关闭文件close方法#1、打开文件,返回文件的句柄f=open(file="xxx",mode=......
  • python源码通过词语标记化器tokenize提取注释并正则匹配测试用例作者名
    提取代码如下importtokenizeimportrewithtokenize.open('readcomment.py')asf:list=[]fortoktype,tok,start,end,lineintokenize.generate_t......
  • python 3.6下 安装mysqlclient
    倒腾了大半天,终于把mysqlclient安装成功,赶紧把步骤进行梳理并记录1、python安装好以后,首先要看一下自己的python是32还是64位的,这关系到你下载的mysqlclient。查看方法:......
  • [oeasy]python0015_十六进制_hexadecimal_字节形态_hex函数
    十六进制(hexadecimal)回忆上次内容上次数制可以转化bin(n)可以把数字转化为​​2进制​​binary接收一个整数(int)得到一个二进制数形式的字符串数字在计算机中是用二进......
  • python-错误和异常-捕获异常
    1.trypython中,捕获异常使用try...except...这种语法来捕捉异常,下面是一个异常捕获的示例#coding=utf-8deftest(a,b):try:print(a/b)exceptZe......
  • python 基础操作 plus
    将python列表中的多个列表转化为一个列表:列表的扁平化处理总结方法一:使用itertools#速度最快importitertoolsa=[[1,2,3,4],[4,4,5,6],[7],[7,8,......
  • python---三十五期
    昨日内容回顾软件开发架构1.C/S架构 客户端、服务端2.B/S架构 浏览器、服务器B/S本质也是C/S架构网络编程前戏基于网络实现数据交互计算机之间要想实现数据......
  • python multiprocessing 多进程
    1获取进程id当我们运行py文件时,该程序的运行就是一个进程,如果在该进程中又创建了其他进程,那么该进程就是主进程,创建的其他进程就是子进程。下面我们通过通过os库中的方法......
  • Python的类和对象
    1.类和对象的定义类用class关键字声明,类中的变量成为属性,函数成为方法,定义方法的时候,需要带上self参数。例:classPerson:#默认继承Object父......
  • c++调用python
    cmakelistscmake_minimum_required(VERSION3.20)project(python_test)set(PYTHON_INCLUDE_DIRS"/home/ubuntu/miniconda3/envs/python38/include/python3.8")INCLUD......