• Ⅳ:垃圾回收制


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

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

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

    • 程序运行过程中会申请大量的内存空间,对于一些无用的内存空间如果不及时清理就是导致内存溢出,导致程序奔溃。因此管理内存是一件非常重要且繁琐的事情,而垃圾回收机制能够把程序猿从繁琐的内存管理中解放出来。

    三、理解GC原理需要储备的知识

    3.1、堆区与栈区

    • 在定义变量时,变量名与变量值都是需要存储的,分别对应内存中的两块区域:堆区与栈区。
    • [ ] 变量名与值内存地址的关联关系存放于栈区
    • [ ] 变量值存放于堆区,内存管理回收的则是堆区的内容,

    3.2 直接引用与间接引用

    • [ ] 直接引用指的是从栈区出发直接引用到的内存地址。
    • [ ] 间接引用指的是从栈区出发引用到堆区后,再通过进一步引用才能到达的内存地址。

    四、垃圾回收机制原理分析

    • Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾。在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用的问题,并且通过“分代回收”(generation collection)以空间换取时间的方式来进一步提高垃圾回收的效率。

    4.1.什么是引用计数?

    引用计数就是:变量值被变量名关联的次数

    如:age=18

    变量值18被关联了一个变量名age,称之为引用计数为1

    用来清除直接引用垃圾

    直接引用

    x = 10 # 10的引用计数为1
    y = x # 10的引用计数为2
    z = y # 10的引用计数为3
    print(id(x))
    print(id(y))
    print(id(z))
    直接引用

    间接引用

    x = 10 # 10的引用计数为1

    列表中存的是值的内存地址

    l = [x, 'a'] # 10的引用计数为2

    print(id(l[0]))
    间接引用

    引用计数扩展阅读

    4.2.标记-清除

    用来清理循环引用情况下引用计数无法清除的垃圾

    循环引用

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

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

    print(l2)
    print(l1[1])

    del l1 # 列表1的引用计数减1,列表1的引用计数变为1
    del l2 # 列表2的引用计数减1,列表2的引用计数变为1

    4.3.分代回收

    降低了引用计数回收内存时的扫描频率,提高了回收效率,分代回收采用的是用“空间换时间”的策略。

    img

    虽然分代回收可以起到提升效率的效果,但也存在一定的缺点:

    '''
    例如一个变量刚刚从新生代移入青春代,该变量的绑定关系就解除了,
    该变量应该被回收,但青春代的扫描频率低于新生代,所以该变量的回收就会被延迟。
    '''

  • 相关阅读:
    版本回退
    时光机穿梭
    创建版本库
    安装Git
    Git简介
    Nexus私服安装
    eclipse中创建MAVEN-web项目
    AsyncTask的使用
    在子线程中更新UI,只能使用Handler
    使用VideoView播放视频
  • 原文地址:https://www.cnblogs.com/qujiu/p/12423650.html
Copyright © 2020-2023  润新知