zoukankan      html  css  js  c++  java
  • 垃圾回收机制

    1、垃圾回收机制详解(了解)
    什么是垃圾回收机制?

    垃圾回收机制时python解释器自带的一种机制专门用来回收不可用变量值所占的内存空间

    为什么要有垃圾回收机制?

    程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间如果不及时清理的话会 导致内存使用殆尽(内存溢出), 导致程
    序崩溃,因此管理内存是一件重要且繁杂的事情,而python解释器 自带的垃圾回收机制把程序员从繁杂的内存管理中解放出来。

    垃圾回收机制原理分析:

    引用计数 :变量值被变量名关联的次数,引用技术为0的变量值称为“垃圾”
    直接引用:x = 10
    y = x(引用计数增加)

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

    标记清除 :用来解决循环引用带来的内存泄露问题(列表的循环引用会产生引用计数不为0的‘垃圾’) 循环引用=>导致内存泄露
    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
    标记
    标记的过程其实就是,遍历所有的GC Roots对象(栈区中的所有内容或者线程都可以作为GC Roots对象),然后将所有
    GC Roots的对象可以直接或间接访问到的对象标记为存活的对象,其余的均为非存活对象,应该被清除。

    清除 清除的过程将遍历堆中所有的对象,将没有标记的对象全部清除掉。

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

    分代指的是根据存活时间来为变量划分不同等级(也就是不同的代)
    新定义的变量,放到新生代这个等级中,假设每隔1分钟扫描新生代一次,如果发现变量依然被引用,
    那么该对象的权重(权重本质就是个整数)加一,当变量的权重大于某个设定得值(假设为3),
    会将它移动到更高一级的青春代,青春代的gc扫描的频率低于新生代(扫描时间间隔更长),
    假设5分钟扫描青春代一次,这样每次gc需要扫描的变量的总个数就变少了,节省了扫描的总时间,
    接下来,青春代中的对象,也会以同样的方式被移动到老年代中。也就是等级(代)越高,被垃圾回收机制扫描的频率越低
  • 相关阅读:
    系统权限控制模型
    [Golang] 剑走偏锋 -- IoComplete ports
    Golang 正则匹配 -- regexp
    golang -- 字符串就地取反
    Hyperledger Fabric chaincode 开发(疑难解答)
    could not launch process: decoding dwarf section info at offset 0x0: too short
    win10 Ubuntu16 双系统
    7-8 哈利·波特的考试
    7-7 六度空间
    7-6 列出连通集
  • 原文地址:https://www.cnblogs.com/h1227/p/12421272.html
Copyright © 2011-2022 走看看