一、为何要垃圾回收
为避免内存泄露的发生,采用垃圾回收机制。
二、何为内存泄露
内存泄露(memory leak)指由于疏忽或错误使程序未能释放而造成不能在使用的内存的情况。内存泄露并非指内存在物理上消失,而是应用程序分配某段内存后,由于设计失误,失去了对段机制的控制,因而造成了内存的浪费。一般常说的内存泄露是指堆内存的泄露。比如C++中,只new,而不delete。
三、垃圾回收机制有那些方法
引用计数算法:每个对象计算指向它的指针的数量,当有一个指针指向自己时计数值+1,当删除一个指向自己的指针时,计数值-1,如果计数值减为0,说明已经不存在指向该对象的指针了,所以可以安全的被销毁。
标记—清除算法:依赖于对所有存活对象进行一次全局遍历来确定哪些对象可以回收,遍历的过程从根出发,找到所有可达对象,除此之外,其他不可达的对象就是垃圾对象,可被回收。整个过程分为两个阶段:标记阶段找到所有存活对象;清除阶段清楚所有垃圾对象。
标记—缩并算法:为了解决内存碎片问题而产生的一种算法。整个过程可以描述为:标记所有的存活对象;通过重新调整存活对象位置来缩并对象图;更新指向被移动了位置的对象的指针。怎么压缩?压缩算法有,1.任意:移动对象时不考虑它们原来的次序,也不考虑它们之间是否有互相引用的关系。2.线性:尽可能的将原来的对象和它所指向的对象放在相邻的位置上,这样可以达到更好的空间局部性。3.滑动:将对象“滑动”到堆的一端,把存活对象之间的自由单元“挤出去”,从而维持了分配时的原始次序。
节点拷贝算法:把整个堆分成两个半区(from,to),垃圾回收的过程是把存活对象从一个半区from拷贝到另一个半区to的过程,而在下一次回收时,两个半区再互换角色。移动结束后,更新对象的指针引用。
总结:四中垃圾回收算法,后三种也称为跟踪垃圾回收。引用计数算法能够平滑的进行垃圾回收,而不会出现“停止”现象,经常出现于一些实时系统中,但同时它又无法解决环形问题;基于跟踪的垃圾回收机制,在每一次垃圾回收的过程中,要遍历或者复制所有的存活对象,非常耗时间和空间。一般要分情况采用不同的回收算法,或者将几种算法相结合使用。
四、python的垃圾回收机制
python的垃圾回收算法采用引用计数算法。