python中的垃圾回收机制

简介:

  相信大家对C语言都不陌生,但是C语言有个很让人烦心的事,就是需要程序员手动的去管理内存。如果写一个项目,不小心忘记关闭申请的内存了,那么将会导致内存泄漏,程序死机。于是一些高级语言就诞生了。本文主要是介绍下python运行时中的垃圾回收机制,仅个人心得,欢迎大家讨论。

内容:

  在python中,python运行时是如何解决内存泄漏(垃圾回收)呢?

  1.引用计数

class Person(object):
    def __init__(self):
        pass
p=Person()

    我们看这段代码,当执行到 p=Person() 时,python运行时自动帮我们申请了一块内存。而当程序结束时,python会自动释放这块内存。这个过程中,python的具体实现:

    

    当程序结束,python运行时会扫描内存,001号内存的引用数如果为0,那么python运行时会把这块内存释放掉。

  2. 隔代回收

    python运行时中的引用计数能解决大部分的内存问题,当如果遇到内存相互引用时,例如:

class Person(object):
def __init__(self):
pass
class School(object):
def __init__(self):
pass
p=Person()
s=School()
p.Sch=s
s.Per=p

    

    在这段代码中,p(001)内存中的Sch变量又指向s(002内存)。s(002)内存中的Per变量又指向p(001内存)。在相互引用下,001内存和002内存的引用计数都为:2。

    当这段代码结束时,p和s都销毁了,但是001和002内存的引用 计数还是为1,那么引用计数的方式就难以实现内存释放了。如果是有8、9个变量相互引用呢

    这时,隔代回收机制就由此而来。隔代回收机制。

      1. 先找出所有有循环引用的内存。

      2. 每隔一段时间,将所有循环引用的内存的引用计数-1

    当程序结束后,会自动回收p和s这两个变量地址。然后加上每隔一段时间回收循环引用的地址,这样就能解决循环引用的问题了。当然,如果是两个内存中多个变量的循环应用,我猜想,如果是我,我会先扫描每块内存中的变量,然后去重复的地址。

原文地址:https://www.cnblogs.com/norain/p/14174581.html