Python的内存管理和垃圾回收

Python高级特性



前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、内存化

小整数对象池:[pycharm自动优化]
  • 解释器 [-5,257)共用对象,常驻内存 单个字符共用对象,常驻内存
  • 单个单词,不可修改,默认开启intern机制,共用对象,引用计数为0,则销毁
  • 字符串(含有空格),开启intern机制,不共用对象,引用计数为0,销毁

python采用的是引用计数机制为主、标记-清除和分代收集两种机制为辅的策略
引用计数

在这里插入代码片

二、垃圾回收

1.引用计数

  1. List item导致引用计数+1的情况
    · 对象被创建,例如a=23
    · 对象被引用,例如b=a
    · 对象被作为参数,传入到一个函数中,例如func(a)

  2. 导致引用计数-1的情况
    · 对象的别名被显式销毁,例如del a
    · 对象的别名被赋予新的对象,例如a=24
    · 一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变量不会)
    · 对象所在的容器被销毁,或从容器中删除对象

代码如下:

import sys
x='axax'
y=sys.getrefcount(x)
print(y)

引用计数无法解决 循环引用问题
使用标记-清除

2.分代收集 (0代、1代、2代)

  • 0代检查时间最频繁

代码如下(示例):

import gc
gc.disable()                     #关闭垃圾回收机制
print (gc.isenabled ( ))         #是否开启
gc.set_debug(gc.DEBUG_LEAK)      #打开调试
gc.collect()                     #手动回收
gc.collect(1)                    #一代
print (gc.garbage)               #打印垃圾
print (gc.get_count ( ))         #

关于一代二代三代检查

print (gc.get_count ( ))
class Person():
    pass
x=[]
for i in range(10):
    x.append(Person())
print (gc.get_count ( ))
> (641, 4, 1)
> (655, 4, 1)
gc.get_threshold() #获得阈值
gc.set_threshold(10,1,1)#设置阀值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值