Python垃圾回收&内存管理

Python垃圾回收&内存管理

1、引用计数器

在python中创建的任何对象都会放在refchain链表中。

name = "xiaoming"
age = 18
hobby = ["篮球", "美女"]

每一个对象内部都会创建一些数据[上一个对象、下一个对象、类型、引用个数](基础数据)
name = "xiaoming"
new = name

[上一个对象、下一个对象、类型、引用个数](基础数据) + val=18(继承基础数据+不用类型的不同表现)
age = 18

[上一个对象、下一个对象、类型、引用个数](基础数据) + items=元素、元素个数(继承基础数据+不用类型的不同表现)




引用计数是一种非常高效的内存管理手段, 当一个 Python 对象被引用时其引用计数增加 1, 当
其不再被一个变量引用时则计数减 1. 当引用计数等于 0 时对象被删除

循环引用的问题

2、标记清除

目的: 为了解决引用计数器循环引用的不足。

实现: 在python底层再维护一个链表, 链表中专门放可能存在循环引用的对象(list/tuple/dict/set)

再python内部某种情况下出发, 会去扫描可能存在循环引用的链表的每个元素, 检查是否循环引用,如果有则让双方的引用计数器-1;如果是为0则垃圾回收。

问题:

  • 什么时候扫描?
  • 可能存在循环引用的链表扫描代价大, 每次扫描耗时久。
3、分代回收

将可能存在循环引用的对象维护成3个链表。

  • 0代: 0代中对象个数达到700个扫描一次, 扫描完之后正常的话就会升级为1代, 然后清空0代。
  • 1代: 0代扫描10次, 则1代扫描一次。扫描完正常之后就会升级为2代, 然后清空1带。
  • 2代: 1代扫描10次, 则2代扫描一次。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值