zoukankan      html  css  js  c++  java
  • 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这两个变量地址。然后加上每隔一段时间回收循环引用的地址,这样就能解决循环引用的问题了。当然,如果是两个内存中多个变量的循环应用,我猜想,如果是我,我会先扫描每块内存中的变量,然后去重复的地址。

  • 相关阅读:
    Kostya Keygen#2分析
    一个简单的windows勒索软件分析
    MSRHook与SSDTHook
    VS2013中调驱动
    VMProtect1.63分析
    Linux内核分析总结
    进程的切换和系统的一般执行过程
    可执行程序的装载
    进程的描述和进程的创建
    扒开系统调用的三层皮(下)
  • 原文地址:https://www.cnblogs.com/norain/p/14174581.html
Copyright © 2011-2022 走看看