引用技术的两个问题
一:循环引用的情况下,引用计数就不好使了。
a="x"
b=a
a=b
解决方法:
标记清除变量的概念:
变量:是由3个部分组成,1、变量名 2、赋值符号 3、变量值
变量都是内在内存中的,在内存中有划分:
栈:变量名(不存值,只是指向一个内存地址)
堆:变量值 --程序员只操控堆,也就是变量值,无法操控栈区。
比如:x="10" , x="20" 这就意味着 变量的值换了一个内存地址。
我们都是通过变量名(栈)访问的变量值(堆)
标记的过程:扫描栈区里所有的内容,将所有栈区的对像,将直接或间接访问的对像标记成存活对像,其余的都为非存活,应该被清除。
通过栈区可到达的对像是gc roots对像
标记清除:
二:效率问题(低), 引用计数引用一次,值就加1,减少就减一 (分代回收解决)
cpython不是时刻都在回收,而是隔一段时间去回收一次,这样就保证效率,cpython使用了分代回收,
1、老年代: 扫描频率比较低(可能是隔1小时扫描一次)
老的数据可能还在经常用
2、年轻代: 扫描频率比较高(可能是隔5分钟扫描一次)
因为新的数据用一次就不用了,可能会被抛弃,这样有利于内存空间的整理
这样就提升扫描效率
cpython 解释器垃圾回收机制是,如果计数引用为零的话会回收,但这样的话,循环引用就无法回收了(计数不可能为0,循环引用会造成内存溢出)。
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。