失效网站建设费支出,东莞人才网58同城招聘,我要自学网网站建设与管理,做软件的网站建设一、引子 首先#xff0c;我们从两个例子入手垃圾回收机制:
a 1000
b 2000
a b
a 100
b 200
a b 这两段代码的功能都是“把b变量的值赋值给a变量”#xff0c;但是在Python的底层逻辑上#xff0c;这两段代码的实现过程确是有所不同的。 过程#xff1a;第一段代码…一、引子 首先我们从两个例子入手垃圾回收机制:
a 1000
b 2000
a b
a 100
b 200
a b 这两段代码的功能都是“把b变量的值赋值给a变量”但是在Python的底层逻辑上这两段代码的实现过程确是有所不同的。 过程第一段代码是在存储空间中先创建了一个对象整数1000之后让变量a指向这个存储空间同理变量b当执行 a b 语句时变量a由原来的指向整数1000变为了指向整数2000同时刚刚创建的存储整数1000的存储空间也被垃圾回收机制回收。 第二段代码中整数对象100和200受到Python整数缓存机制的影响通常对于 -5到255之间的整数python会预先创建他们并存储所以在执行 a b语句后整数100并没有被回收
二、垃圾回收机制 有了上面的例子后我们来正式学习Python的垃圾回收机制 Python的垃圾回收机制(GC) 主要依赖于引用计数法为基础并辅以“代”generation收集机制来处理循环引用的问题。这一机制确保了不再使用的对象能够被正确地识别并进行回收释放内存。 1.引用计数 Python中每个对象在创立之初都会获得一个引用计数用来记录有多少个引用指向这个对象不同于c语言的变量创建、存储机制。 当创建一个对象并把他赋值给一个变量时该对象的引用计数变为1。如果有另一个变量被赋值为这个对象该对象的引用计数加1。同样的若是本来指向该对象的引用现在不再指向它则引用计数减1。当一个对象的引用计数变为0时意味着没有任何引用指向这个对象它就会被垃圾回收器立即回收。 2.解决循环引用的分代收集机制 有了基于引用计数的回收机制后我们不禁思考一个问题若是两个对象之间或者多个对象之间互相引用但是却没有任何一个变量来指向他们中的任意一个那么会造成他们不会被回收掉内存泄漏 为了解决这一问题Python引入了分代收集机制: 在这个系统中所有的对象都被分配到三个“代”generation中的一个0代、1代和2代。一般情况下新创建的对象被放入0代中。如果在某次0代的垃圾回收过程中对象存活下来它就会被移动到1代同样从1代存活下来的对象会被移动到2代。因为预期较老的对象在高代中的对象较少会变成垃圾所以较高代的垃圾回收频率会低于较低代的。 垃圾回收器通过检查对象之间的引用关系来识别循环引用。如果一组对象之间只有相互引用而没有任何外部引用指向这组对象这组对象就可以被认为是可回收的。
3.补充(触发条件) Python的垃圾回收可以被显式地触发也可以根据需要自动触发。自动触发的条件基于分配和释放对象的数量以及各代中对象的数量。可以通过gc模块调整垃圾回收的行为如 启用或禁用垃圾回收、手动触发垃圾回收以及调整代之间的阈值等。