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

    # 垃圾回收

    # 小整数对象池

    # a = 100
    # python对小整数的定义是[-5,257],这些证书对象是提前创建好的,不会被垃圾回收,再一个python的程序中,所有位于这个范围内的正式使用的都是一个对象

    # 大整数对象池
    # 每一个大整数,均创建一个新的对象
    # >>> A = 1000
    # >>> id(A)
    # 1797282549648
    # >>> B = 1000
    # >>> id(B)
    # 1797289269392

    # intern机制
    # >>> a = 'hello'
    # >>> b = 'hello'
    # >>> id(a)
    # 1797289499256
    # >>> id(b)
    # 1797289499256


    # >>> b = 'hello world'
    # >>> a = 'hello world'
    # >>> id(a)
    # 1797289512176
    # >>> id(b)
    # 1797289512112


    # 总结:
    # 小整数[-5,257)共用对象,常驻内存
    # 单个字符共用对象,常驻内存
    # 单个单词,不可修改,默认开启intern机制,共用对象,引用计数为0,则销毁

    # GC垃圾回收(Garbage collection)

    # 引用计数机制:
    # python里每一个东西都是对象,他们的核心就是一个结构体:PyObject
    # typedef struct_object{
    # int ob_refcnt
    # struct_typeobject *ob_type
    # } PyObject
    # PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt
    # 就会增加,当引用它的对象被删除,他的ob_refcnt就会减少
    # 当引用计数为0时,该对象生命就结束了


    # 引用计数机制的有点:
    # 简单
    # 实时性。一旦没有引用,内存就直接释放了。不用向其他机制等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时.


    # import gc
    # class ClassA():
    # def __init__():
    # print("object born,id:%s"%str(hex(id(self))))

    # def f2():
    # while True:
    # c1 = ClassA()
    # c2 = ClassA()
    # c1.t = c2
    # c2.t = c1
    # del c1
    # del c2
    # gc.disable()
    # f2()


    # 话说Ruby与Python垃圾回收

    # 隔代回收
    # python以引用计数机制为主,隔代收集两种机制为辅的策略


    # 0----------------------------------------------- 执行100次 -1 循环使用,引用计数不能为0,看是否循环引用?如果是循环引用就-1

    # 1----------------------------------------------- 执行1次

    # 2--------------------------------------------


    import gc
    print(gc.get_count()) #获取当前自动执行垃圾回收的技术器,返回提个长度为3的列表
    # (243, 3, 1)
    print(gc.get_count())


    print(gc.get_threshold()) # 获取的gc模块中自动执行垃圾回收的频率
    # (700, 10, 10)


    print(gc.set_threshold()) #设置自动执行垃圾回收的频率


    # 1.导致引用计数+1的情况
    # 1.对象被创建,如a=23
    # 2.对象被引用,如b=a
    # 3.对象被作为参数,传入一个函数中,例如func(a)
    # 4.对象作为一个元素,存储在容器中,list=[a,a]

    # 2.导致引用计数-1的情况
    # 对象的别名呗显示销毁 列如del a
    # 对象的别名被赋予新对象,例如a = 23、
    # 一个对象离开他的作用域,如f函数执行完毕时,func函数中的局部变量(全局变量不会)
    # 对象所在的容器被销毁,或者从容器中删除对象

    # gc模块的自动垃圾回收机制
    # 必须要import gc
    # gc.enable() 开启
    # gc.disabled() 禁用
    # gc.isenabled() 是否开启gc
    # gc.collect() 收集垃圾(手动清理垃圾)


    # gc.garbage() 显示清理垃圾


    # import sys
    # a = "hello world"
    # b = c
    # sys.getrefcount(a)得到的值-1就是真正的引用个数

  • 相关阅读:
    乘电梯(动规+单调队列队头优化)
    贪心基础题目整理
    动规基础方程整理
    [第一波模拟day3T3]{益智游戏}(game.cpp)
    [第一波模拟day3T2]{独立集}(bubble.cpp)
    [第一波模拟day1T2]{分班}(divide.cpp)
    考前模版整理
    [Noip2004][Day ?][T?]合并果子(?.cpp)
    [Noip2017][Day 1][T1]玩具谜题(toy.cpp)
    新开始?
  • 原文地址:https://www.cnblogs.com/sklhtml/p/9455759.html
Copyright © 2011-2022 走看看