1. 小整数对象池
整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间。

Python 对小整数的定义是 [-5, 256] ,这些整数对象是提前建立好的,不会被垃圾回收。在一个 Python 的程序中,所有位于这个范围内的整数使用的都是同一个对象。
如下所示:

2. 大整数对象池
每一个大整数,均创建一个新的对象。
如下所示:

3. intern机制(字符串驻留)
单个单词,不可修改,默认开启intern机制,共用对象,引用计数为0,则销毁。

字符串中包含空格等特殊字符,不可修改,没开启intern机制,不共用对象,引用计数为0,销毁。

4. Garbage collection(GC垃圾回收)
python里采用了垃圾收集机制,采用引用计数机制为主,分代收集机制为辅的策略,保证了内存尽量不出现垃圾。

引用计数
python中为了能够知道当前这个对象有多少变量指向它,因此会在每个对象中有一个小空间用于存放引用计数。
如:

a = xx() #此时实例对象中有个空间存储1,表示有1个变量指向这个实例对象
b = a     #对象的空间中由1变为2,表示有两个变量指向这个实例对象

引用计数机制的优点:

  • 简单
  • 实时性:一旦没有引用,内存就直接释放了。不用像其他机制等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时。

引用计数机制的缺点:

  • 维护引用计数消耗资源
  • 循环引用
list1 = []
list2 = []
list1.append(list2)
list2.append(list1)

其中list1与list2相互引用,如果不存在其他对象对它们的引用,list1与list2的引用计数也仍然为1,所占用的内存永远无法被回收,这将是致命的。 对于如今的强大硬件,缺点1尚可接受,但是循环引用导致内存泄露,注定python还将引入新的回收机制。(分代收集)

(1)导致引用计数+1的情况

  • 对象被创建,例如a=23
  • 对象被引用,例如b=a
  • 对象被作为参数,传入到一个函数中,例如func(a)
  • 对象作为一个元素,存储在容器中,例如list1=[a,a]

(2)导致引用计数-1的情况

  • 对象的别名被显式销毁,例如del a
  • 对象的别名被赋予新的对象,例如a=24
  • 一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变量不会)
  • 对象所在的容器被销毁,或从容器中删除对象

3、查看一个对象的引用计数

import sys
a = "hello world"
sys.getrefcount(a)

可以查看a对象的引用计数,但是比正常计数大1,因为调用函数的时候传入a,这会让a的引用计数+1

有三种情况会触发垃圾回收:

  • 当gc模块的计数器达到阈值的时候,自动回收垃圾
  • 调用gc.collect(),手动回收垃圾
  • 程序退出的时候,python解释器来回收垃圾

解决循环引用的方式:隔代收集

隔代收集:把对象分为三代,一开始,对象在创建的时候,放在一代中,如果在一次一代的垃圾检查中,该对象存活下来,就会被放到二代中,同理在一次二代的垃圾检查中,该对象存活下来,就会被放到三代中。

gc模块里面会有一个长度为3的列表的计数器,可以通过gc.get_count()获取。

例如(488,3,0),其中488是指距离上一次一代垃圾检查,Python分配内存的数目减去释放内存的数目,注意是内存分配,而不是引用计数的增加。例如:

print(gc.get_count()) # (590, 8, 0)
a = ClassA()
print(gc.get_count()) # (591, 8, 0)
del a
print(gc.get_count()) # (590, 8, 0)

3是指距离上一次二代垃圾检查,一代垃圾检查的次数,同理,0是指距离上一次三代垃圾检查,二代垃圾检查的次数。

gc模快有一个自动垃圾回收的阈值,即通过gc.get_threshold函数获取到的长度为3的元组,例如(700,10,10) 每一次计数器的增加,gc模块就会检查增加后的计数是否达到阈值的数目,如果是,就会执行对应的代数的垃圾检查,然后重置计数器

例如,假设阀值是(700,10,10):

当计数器从(699,3,0)增加到(700,3,0),gc模块就会执行gc.collect(0),即检查一代对象的垃圾,并重置计数器为(0,4,0)
当计数器从(699,9,0)增加到(700,9,0),gc模块就会执行gc.collect(1),即检查一、二代对象的垃圾,并重置计数器为(0,0,1)
当计数器从(699,9,9)增加到(700,9,9),gc模块就会执行gc.collect(2),即检查一、二、三代对象的垃圾,并重置计数器为(0,0,

文章参考视频:https://www.bilibili.com/video/BV1Cu411e7Mh?spm_id_from=333.1007.top_right_bar_window_default_collection.content.click

python垃圾回收相关推荐

  1. python 释放变量所指向的内存_通俗易懂的Python垃圾回收机制及内存管理

    Python垃圾回收机制及内存管理 内存管理: 先定义一个变量 name='wxl' 那么python会在内存中开辟一小块区域存放"wxl",此时变量的值是我们真正想要存储的,wx ...

  2. python是不是特别垃圾-谈谈python垃圾回收机制

    什么是垃圾回收机制? 首先,咱先来解释名词,垃圾回收是不是就是将没用的,废弃的东西回收起来. 在坐的各位都没有女朋友对吧,那难以想象你们的房间会是一个什么样子,可能会有很多垃圾,很凌乱,自己也不收拾. ...

  3. python垃圾回收离职_谈谈python垃圾回收机制

    什么是垃圾回收机制? 首先,咱先来解释名词,垃圾回收是不是就是将没用的,废弃的东西回收起来. 在坐的各位都没有女朋友对吧,那难以想象你们的房间会是一个什么样子,可能会有很多垃圾,很凌乱,自己也不收拾. ...

  4. 【Python】学习笔记总结5(Python垃圾回收及内存优化)

    文章目录 五.Python垃圾回收 1.引用计数(主) 2.GC负责的主要任务 3.标记-清除 4.引用计数不能回收的案例分析 5.分代收集 6.GC的阈值 7.GC垃圾回收自动触发机制 7.内存优化 ...

  5. python垃圾回收机制原理_如何理解和掌握Python垃圾回收机制?

    在编程世界里,当一个对象失去引用或者离开作用域后,它就会被当做垃圾而被自动清除,这就是垃圾回收机制.在现在的高级语言如Python.Java都使用了垃圾回收机制,不过与Java采用的垃圾收集机制不同, ...

  6. python垃圾回收 (GC) 机制

    Python 能够自动进行内存分配和释放,但了解 python 垃圾回收 (garbage collection, GC) 的工作原理可以帮助你写出更好更快的 Python 程序.Python 使用两 ...

  7. python 垃圾回收详解

    原文:https://zhuanlan.zhihu.com/p/31150408 总纲 策略和垃圾回收系统工作内容 引用计数详解 标记-清除+分代收集 循环引用 编程应用-常见方法 ex 过程详解 使 ...

  8. python 垃圾回收机制

    DAY 18. python垃圾回收机制 python GC主要有三种方式 引用计数 标记清除 分代回收 其中,以引用计数为主. 18.1 引用计数(Reference Counting) <寻 ...

  9. Python垃圾回收(gc)拖累了程序执行性能?

    起因 前段时间,在做文本处理的实验时,需要预加载大量的原始数据(100W),在Python中使用的字典(dict)类型负责保存这些数据,很快就开发完成 了一个Demo版,然而程序执行的效率不是那么令人 ...

  10. python垃圾回收离职_垃圾回收gc.md

    垃圾回收gc python的垃圾收回机制不想c和c++是开发者自己管理维护内存的,python的垃圾回收是系统自己处理的,所以作为普通的开发者,我们不需要关注垃圾回收部分的内容,如果想要深层次理解py ...

最新文章

  1. Bootstrap 中: data-toggle 与 data-target 的作用
  2. w7计算机不显示移动硬盘,win7系统不显示移动硬盘怎么回事_win7移动硬盘在电脑上显示不出来如何处理-win7之家...
  3. 熬之滴水穿石:Spring--精简的J2EE(5)
  4. Design Tradeoffs for SSD Performance
  5. 企业网站排名,站内布局,不只有关键词密度
  6. jstl获取表格单元格值_表格单元格和位置绝对值
  7. 生物信息之独孤九剑——sort
  8. myeclipse cracker
  9. 2011年国庆2天厦门到平潭岛湄洲岛自驾游
  10. 在线教育-谷粒学院学习笔记(八)
  11. HTTP协议的理解和使用
  12. js根据一个时间计算N年后的时间-计算时间demo示例
  13. 关于 ajax Content-Type 的问题 贼拉有用的!!!
  14. Woohoo flash
  15. 抗阿达木单抗的抗体可能与阿达木单抗治疗过程中静脉和动脉血栓事件相关
  16. springboot2.3.3+springsecurity
  17. 如何成为Java软件工程师
  18. Ubuntu 安装时出现“failed to load ldlinux.c32” 方法总结
  19. 计算机教学改革典型案例,高职计算机课程案例化与信息化融合的教学改革探讨...
  20. 计算机中最小的信息计量单位是什么,计算机中最小的信息计量单位是什么?

热门文章

  1. 3D Object Detection From Point Cloud with Part-Aware And Part-Aggregation Network
  2. 音视频学习之rtsp学习rtp协议的理解(rtp)
  3. Android开发单选按钮功能,Android单选按钮RadioButton的使用详解
  4. excel VBA进行模具管理数据库编程
  5. 计算机网络三种数据交换方式
  6. 高斯模糊java代码_一行java代码实现高斯模糊效果
  7. A55+A76+GIC400大小核终于跑起来内核了
  8. 新媒体运营到底有多苦逼
  9. Python 3 字符串 rstrip( ) 方法(转载)
  10. Ubuntu16.04、18.04 设置pycharm图标到桌面(成功使用)