# 垃圾回收机制: python采用的主要的垃圾回收机制是引用计数 import sys import gc class A: def __del__(self): print("I`m collected ...") # 引用计数: # 在python中为每一个对象记录引用的数量 # 当引用计数为0时,此时对象会变成垃圾被立即回收 # 引用计数这种机制会一直运行,确保引用归零时的对象被立即回收 # sys.getrefcount() 获取一个对象的引用计数 # 引用计数,无法处理交叉引用的情况,所以在python中使用第二种垃圾回收机制 # 分代收集 # python的垃圾回收机制,引用计数为主,分代收集为辅 # # 分代收集: # 在python中,将所有的对象分成了三代 # 每代中都用一个链表来存储对象,0代链表中存储的都是刚刚创建的对象 # 1代链表存放经历过一次垃圾回收的对象; # 2代链表存放的是经历过两次以上垃圾回收的对象; # 0代链表垃圾回收最频繁 # 1代链表其次 # 2代链表回收的次数最少 # 回收的流程: # 分代收集--> 以0代链表为例,它会先从链表中找到一个被变量引用的对象,将该对象作为根(root)对象 # 然后找到根对象所引用的所有对象,这些对象升级到1代链表,然后继续回到0代中寻找根对象,以此类推 # 直到无法找到根对象为止,然后统一对0代链表中的对象进行引用-1,如果引用变为0,则将其回收; # print(gc.get_threshold()) # (700, 10, 10) 获取分代收集的设置信息 # 返回一个元组,元组中有三个元素,分别对应三代 # 700 当0代链表中超过700个对象时,自动进行分代收集 # 10 当0代链表回收10次后,对0代和1代进行收集 # 10 当1代链表回收10次以后,对所有链表进行收集 # gc.disable() # 禁用分代回收机制,出现交叉引用会是内存消耗急剧上升,所以一般不会做diable操作 # a = A() # b = a # a = None # b = None a = A() print(sys.getrefcount(a)) # 2 通过该方法查看的引用计数,都会比实际的数量大 1,因为获取时作为参数传入也被引用了 input()
标签:Python,回收,链表,对象,分代,垃圾,引用 来源: https://www.cnblogs.com/guo-s/p/16624182.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。