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())