• day05学习笔记-垃圾回收机制


    一、引入

      解释器在执行到定义变更的语法时,会申请内存空间来存放变量,但是内存空间的容量有限,如何处理所占用内存空间的回收问题,当这个变量值没有用了(简称垃圾)就应该回收掉了。

    二、什么是垃圾回收机制?

      垃圾回收机制(简称GC),是python解释器自带的一种机制,专门用来回收不可有的变量值所占用的内家间

    三、为什么要用垃圾回收机制?

      因为程序在运行过程中会申请大师的内存空间,而对于没有用的内存空间的占用,会导致程序内存溢出,程序崩溃,所以需要定时的清理这些没有用的垃圾,翻译内存,缓解计算机的压力

    这个原理比较难,详见链接:(借用下egon老师的博客)

    https://www.cnblogs.com/xiaoyuanqujing/articles/11640905.html


    1、引用计数
     x = 10 # 直接引用
     print(id(x))
     y = x
     z = x
     
     l = ['a', 'b', x] # 间接引用
     print(id(l[2])) #

     d = {'mmm': x} # 间接引用

     print(id(d['mmm']))


     x=10
     l=['a','b',x] # l=['a'的内存地址,'b'的内存地址,10的内存地址]

     x=123
     print(l[2])


     x=10
     x=[10,]

     l=['a','b',10]

    以上例子中讲解了,直接引用与间接引用,间接引用说到底也是需要靠直接引用的。

    所以若是把某一个变量值的直接引用全部解绑了的话,有多少间接引用,也无法调用了,也就是垃圾了,就会回收了。

    垃圾回收机制的是python解释器自己自动处理的,在内存不够的时候自动处理掉这些垃圾,以释放内存。


    2、标记清除:用来解决循环引用带来的内存泄露问题
     循环引用=>导致内存泄露
    l1=[111,]
    l2=[222,]

    l1.append(l2) # l1=[值111的内存地址,l2列表的内存地址]
    l2.append(l1) # l2=[值222的内存地址,l1列表的内存地址]

     print(id(l1[1]))
     print(id(l2))

     print(id(l2[1]))
     print(id(l1))

     print(l2)
     print(l1[1])

    del l1
    del l2

    这上面的例了讲了下l1与l2的互相引用,你中有我,我中有你,正是因为有可能有这种现象的出现才会有垃圾产生,而无法回收,

    所以有了新的方法,标记清除来解决这个问题


     3、分代回收:用来降低引用计数的扫描频率,提升垃圾回收的效率

  • 相关阅读:
    将Web项目War包部署到Tomcat服务器基本步骤(完整版)
    性能实战分析-环境搭建(一)
    SQL Server Profiler追踪数据库死锁
    性能测试的各种监控工具大全
    python学习
    Linux常见面试题一
    Linux下用于查看系统当前登录用户信息的4种方法
    HDU 1394 Minimum Inversion Number(线段树求逆序对)
    SGU 180 Inversions(离散化 + 线段树求逆序对)
    Codeforces Round #FF (Div. 2) C. DZY Loves Sequences
  • 原文地址:https://www.cnblogs.com/xiao-zang/p/12420802.html
Copyright © 2020-2023  润新知