Python垃圾回收&内存管理

Python垃圾回收&内存管理

1、引用计数器

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

Python垃圾回收&内存管理_第1张图片

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

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

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

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




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

循环引用的问题

Python垃圾回收&内存管理_第2张图片

2、标记清除

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

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

Python垃圾回收&内存管理_第3张图片

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

问题:

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

3、分代回收

Python垃圾回收&内存管理_第4张图片

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

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

你可能感兴趣的:(Python垃圾回收&内存管理)