添加链接 注册    登录
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
求醉的大熊猫  ·  Issue 29343: ...·  2 周前    · 
聪明的足球  ·  彭涛python爬虫训练营(完结无密) - ...·  1 周前    · 
从容的打火机  ·  Python爬虫训练营 - ...·  1 周前    · 
兴奋的蘑菇  ·  [Python]彭涛Python爬虫训练营 ...·  1 周前    · 
霸气的手套  ·  Python开发 程序员联盟·  1 周前    · 
玉树临风的领带  ·  工具提示框 (Tooltips) · ...·  4 月前    · 
会开车的煎饼  ·  Tandem完整教學&評價,我用過最好的語言 ...·  7 月前    · 
闷骚的紫菜  ·  自來水全球資訊網-法規命令·  7 月前    · 
很拉风的石榴  ·  Products - maipu·  8 月前    · 
叛逆的木瓜  ·  这个改变了迪士尼的男人,就要退休了-虎嗅网·  1 年前    · 
link管理  ›  Python中的垃圾回收机制 | Victor's Blog
循环引用 python算法 blog python
http://victorfengming.gitee.io/cp/python/python-recycling-mechanism/
忧郁的感冒药
2 年前
avatar
Articles
448
Tags
87

Home
Archives
Tags
Categories
List
  • Music
  • Movie
Link
About
Victor's Blog
Home
Archives
Tags
Categories
List
  • Music
  • Movie
Link
About

Python中的垃圾回收机制

Created 2019-11-28 | Updated 2021-11-03
| Post View:

一、概述

python采用的是 引用计数 机制为主, 标记-清除 和 分代收集(隔代回收) 两种机制为辅的策略。

现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内存的方式。自己管理内存极其自由,可以任意申请内存,但如同一把双刃剑,为大量内存泄露,悬空指针等bug埋下隐患。
对于一个字符串、列表、类甚至数值都是对象,且定位简单易用的语言,自然不会让用户去处理如何分配回收内存的问题。
python里也同java一样采用了垃圾收集机制,不过不一样的是:
python采用的是引用计数机制为主,标记-清除和分代收集(隔代回收)两种机制为辅的策略。

二、引用计数机制

引用计数法机制的原理是:每个对象维护一个ob_ref字段,用来记录该对象当前被引用的次数,每当新的引用指向该对象时,它的引用计数ob_ref加1,每当该对象的引用失效时计数ob_ref减1,一旦对象的引用计数为0,该对象立即被回收,对象占用的内存空间将被释放。它的缺点是需要额外的空间维护引用计数,这个问题是其次的,不过最主要的问题是它不能解决对象的“循环引用”,因此,也有很多语言比如Java并没有采用该算法做来垃圾的收集机制。

python里每一个东西都是对象,它们的核心就是一个结构体:PyObject

PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少

引用计数为0时,该对象生命就结束了。

引用计数机制的优点:

2、实时性:一旦没有引用,内存就直接释放了,不用像其他机制得等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时。

引用计数机制的缺点:

1、维护引用计数消耗资源

2、循环引用

import sys
class A():
    def __init__(self):
        '''初始化对象'''
        print('object born id:%s' %str(hex(id(self))))

def f1():
‘’’循环引用变量与删除变量’’’
while True:
c1=A()
del c1

def func(c):
print(‘obejct refcount is: ‘,sys.getrefcount(c)) #getrefcount()方法用于返回对象的引用计数

if name == ‘main‘:
#生成对象
a=A()
func(a)

<span class="c1">#增加引用</span>
<span class="n">b</span><span class="o">=</span><span class="n">a</span>
<span class="n">func</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
 
推荐文章
求醉的大熊猫  ·  Issue 29343: sock.close() raises OSError EBADF when socket's fd is closed - Python tracker
2 周前
聪明的足球  ·  彭涛python爬虫训练营(完结无密) - h23bc
1 周前
从容的打火机  ·  Python爬虫训练营 - 从基础到分布式架构全栈实战 | 幽络源
1 周前
兴奋的蘑菇  ·  [Python]彭涛Python爬虫训练营 Python到爬虫工程师视频课 价值4699元 | getfromcode - IT编程课程资源平台
1 周前
霸气的手套  ·  Python开发 程序员联盟
1 周前
玉树临风的领带  ·  工具提示框 (Tooltips) · Bootstrap 5 繁體中文文件 - 六角學院 v5.0
4 月前
会开车的煎饼  ·  Tandem完整教學&評價,我用過最好的語言交換APP - 自學顧問|陳相銘 ( Wing )|學習策略 / 目標設定 / 時間管理 / 學習方法
7 月前
闷骚的紫菜  ·  自來水全球資訊網-法規命令
7 月前
很拉风的石榴  ·  Products - maipu
8 月前
叛逆的木瓜  ·  这个改变了迪士尼的男人,就要退休了-虎嗅网
1 年前
Link管理   ·   Sov5搜索   ·   小百科
link管理 - 链接快照平台