Python的垃圾回收与内存泄露

本文详细介绍了Python中的垃圾回收机制,包括引用计数、标记清除和分代回收,以及如何处理循环引用问题。同时,阐述了内存泄露的定义、原因及解决方法,帮助读者理解Python内存管理的关键概念。
摘要由CSDN通过智能技术生成

基础知识

容器

哪些是容器对象:列表、数组、字典、元组、类和实例等

栈区和堆区

1、我们在定义变量的时候,变量名和变量值都是需要存储的,分别对应内存中的两块区域:栈区和堆区。
2、栈区:存放变量名与值内存地址的关联关系
3、堆区: 存放变量值。内存管理回收的就是堆区的内容。
例如:定义了两个变量x=10, y=20,具体解释如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BueiUsla-1640616720544)(Python的垃圾回收与内存泄露_files/74577840.png)]
当我们执行x=y时,内存中的栈区与堆区变化如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MbgEsesK-1640616720546)(Python的垃圾回收与内存泄露_files/74637541.png)]

直接引用和间接引用

1、直接引用:从栈区出发直接引用到内存地址。
2、间接引用:从栈区出发引用到堆区后,再通过进一步引用才能到达内存地址。
间接引用值存在与容器中,例如:列表、字典、元组等。容器的变量名存储着整个容器的内存地址,容器中又存储的是每个元素的内存地址。
3、直接引用的例子:

x = 10
y = “刘翔”
z = [1, "good"] 

4、间接引用的例子:

list_1 = [1, 2]  # 列表本身被变量名list_1直接引用,包含的元素被列表间接引用
x = 10  # 值10被变量名x直接引用
list_2 = [x, list1]  # 列表本身被list_2直接引用,包含的元素被列表间接引用

5、解释图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VLtrnPIw-1640616720547)(Python的垃圾回收与内存泄露_files/75386194.png)]
6、容易犯错的地方:

x  = 10
y = ["good",  x]
x = 20
print(x)
print(y)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2RQwTBcR-1640616720548)(Python的垃圾回收与内存泄露_files/75655565.png)]

循环引用

1、定义:两个对象之间分别相互引用对方。
2、引发的问题:当出现对象(变量值)不再被任何变量名所引用(那就得回收)时,由于它的引用计数不会为0,所以会导致该对象永远(变量值/内存)不会被回收。这样最终的结果会导致内存泄露!
2

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值