<code class="language-python"># <a href="https://www.gaodaima.com/tag/%e5%86%85%e5%ad%98" title="查看更多关于内存的文章" target="_blank">内存</a>管理:<a href="https://www.gaodaima.com/tag/%e5%9e%83%e5%9c%be" title="查看更多关于垃圾的文章" target="_blank">垃圾</a>回收机制 # 1. 什么是垃圾? # 垃圾:当一个<a href="https://www.gaodaima.com/tag/%e5%8f%98%e9%87%8f%e5%80%bc" title="查看更多关于变量值的文章" target="_blank">变量值</a>被绑定的变量名的个数为0时,该变量值无法被访问到,称之为垃圾 # 2. 什么是垃圾回收机制? # 垃圾回收机制(简称GC)是自动帮助我们管理内存,清理垃圾的一种工具(用来回收不可用的变量值所占用的内存空间) # 3. 为什么要用垃圾回收机制? # 程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间如果不及时清理的话会导致内存使用殆尽(内存溢出),导致程序崩溃,因此 # 4. 理解GC原理需要储备的知识 # 4.1 堆区与栈区 # 在定义变量时,变量名与变量值都是需要存储的,分别对应内存中的两块区域:堆区与栈区。 # 1、变量名与值内存地址的关联关系存放于栈区 # 2、变量值存放于堆区,内存管理回收的则是堆区的内容 x = 10 y = 20 """ 栈区 堆区 其他区 x->140730216776240——》 10 y->140730216776560——》 20 """ # 当我们执行x=y时,内存中的栈区与堆区变化 """ 栈区 堆区 其他区 x (X) 140730216776240 (X) 10 x->140730216776560——》 20 y->140730216776560——》 20 """ # 4.2 直接引用和间接引用 # 直接引用:指从栈区出发直接引用到的内存地址 # 间接引用:指从栈区出发直接引用到堆区后,在通过进一步引用才能到达的内存地址 l2 = [20, 30] # 列表本身被变量名l2直接引用,包含的元素被列表间接引用 x = 10 # 值10被变量名x直接引用 l1 = [x, l2] # 列表本身被变量名l1直接引用,包含的元素被列表间接引用 # 5.垃圾回收机制原理 # 5.1、引用计数:变量值被变量名关联的次数 # 当一个对象的引用计数被创建或者复制时,对象的引用计数增加1; # 当一个对象的引起被销毁时,对象的引用计数减1; # 当对象的引用计数减少为0时,就意味着对象已经没有被任何人使用了,可以将其所占用内存释放. # 优点: # 简单、直观 # 实时性,只要没有了引用就释放资源. # 缺点: # 维护引用计数需要消耗一定的资源 # 循环引用时,无法回收.正是因为这个原因,才需要通过标记-清理和分代收集机制来辅助引用计数机制. x = 10 # 直接引用 print(id(x)) y = x z = x l = ["a", "b", "c"] # 间接引用 print(id(l[2])) d = {"x": 213} # 间接引用 print(d["x"]) x = 10 l = ["a", "b", x] # l=["a"的内存地址,"b"的内存地址,10的内存地址] x = 123 print(l[2]) # 10 # 5.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 # 5.3、分代回收:用来降低引用计数的扫描频率,提升垃圾回收的效率 # 将系统中的所有内存块根据其存活时间划分为不同的挤和, # 每一个集合就成为一个"代",垃圾收集的频率随着"代"的存活时间的增大而减小: # 也就是说,活得越长的对象,就越不可能时垃圾,就应该减少对他的垃圾收集频率 # 如何来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量 # 如果一个对象经过的垃圾收集次数越多,可以得出;该对象存活时间就越长 </code>
www#gaodaima.com来源gao!%daima.com搞$代*!码$网搞代码