python笔记38 垃圾回收机制 引用计数 标记清除 python中的GC模块

本文探讨了Python中的内存管理,包括使用`sys.getrefcount()`跟踪对象引用计数,以及循环引用和垃圾回收(GC)机制。示例展示了如何通过`psutil`库获取进程内存使用情况,并通过`gc.collect()`手动触发GC。文章还提到了GC的分代回收策略,以及GC阈值的获取。
摘要由CSDN通过智能技术生成

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

 import  sys
# sys.getrefcount()
a=[]
print(sys.getrefcount(a)) #两次 判断变量使用过的次数
b=a
print(sys.getrefcount(a)) #三次
c=b
d=b
f=b
f=a
print(sys.getrefcount(a))

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(venv) D:\pythonProject1\lajihuishou>pip install psutil
Collecting psutil
  Downloading psutil-5.8.0-cp39-cp39-win_amd64.whl (246 kB)
     |████████████████████████████████| 246 kB 4.1 kB/s
Installing collected packages: psutil
Successfully installed psutil-5.8.0

(venv) D:\pythonProject1\lajihuishou>
import  sys
import psutil
import os
def showMenSize(tag):
    pid=os.getpid()
    p=psutil.Process(pid)
    info=p.memory_full_info()
    memory=info.uss/1024/1024
    print('{} memory used:{}Mb'.format(tag,memory))
    pass

#验证循环引用的情况
def func():
    showMenSize('初始化')
    a=[i for i in range(1000000)]
    b=[i for i in range(1000000)]
    a.append(b)
    b.append(a)
    showMenSize('创建列表对象 a b 之后')
    pass

func()
showMenSize('完成时候')

在这里插入图片描述

相互引用,引用数不为0,不会主动清理

import  sys
import psutil
import os
def showMenSize(tag):
    pid=os.getpid()
    p=psutil.Process(pid)
    info=p.memory_full_info()
    memory=info.uss/1024/1024
    print('{} memory used:{}Mb'.format(tag,memory))
    pass

#验证循环引用的情况
def func():
    showMenSize('初始化')
    a=[i for i in range(1000000)]
    b=[i for i in range(1000000)]
    a.append(b)
    b.append(a)
    showMenSize('创建列表对象 a b 之后')
    print(sys.getrefcount(a))
    print(sys.getrefcount(b))
    pass

func()
showMenSize('完成时候')

在这里插入图片描述

即使删除变量,其占用空间也不会消失

引用GC

程序一般都是开启GC自动释放的,需要等待出发时间阈值

import  sys
import psutil
import os
import gc
def showMenSize(tag):
    pid=os.getpid()
    p=psutil.Process(pid)
    info=p.memory_full_info()
    memory=info.uss/1024/1024
    print('{} memory used:{}Mb'.format(tag,memory))
    pass

#验证循环引用的情况
def func():
    showMenSize('初始化')
    a=[i for i in range(1000000)]
    b=[i for i in range(1000000)]
    a.append(b)
    b.append(a)
    showMenSize('创建列表对象 a b 之后')
    print(sys.getrefcount(a))
    print(sys.getrefcount(b))
    pass

func()
gc.collect()  #手动释放
showMenSize('完成时候')

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

GC不能处理未使用的对象 因为应用计数不会为0
分代回收:分为3代,0,1,2 每一代单独启用阈值.
在这里插入图片描述
全部的引用都为0代链表 0代为即将释放的对象
有被其他引用且为活跃的引用将会放到1代链表
在这里插入图片描述

GC模块

回收机制加1减1的情况

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

print(gc.get_threshold())

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值