垃圾回收器

来源:互联网 发布:域名注册 不需要实名 编辑:程序博客网 时间:2024/06/15 19:05

引用计数(Reference Count)

原理

在每个对象中保存该对象的引用计数,当引用发生增减时对引用计数进行更新。

  • 引用计数的增减:一般发生在变量赋值、对象内容更新、函数结束(局部变量不再被引用)等时间点
  • 引用计数变为0:代表该对象不被引用,可以进行回收。

优点

  • 容易实现
  • 对象在不被引用的瞬间释放,由于GC而产生的中断时间比较短

缺点

  • 无法释放循环引用的对象
  • 不适合并行处理

    引用计数并不适合并行处理。为了在多线程环境下避免多个线程同时操作引用计数,引用计数的操作必须采用独占的方式来进行,如果引用计数操作频繁发生,每次都要使用加锁等并发控制机制的话,会造成较大的开销。

标记清除(Mark & Sweep)

原理

  • 将存储器视为一张有向可达图,节点被分为一组根节点(根节点不在堆中,包含指向堆的指针)与一组堆节点。
  • 存在一条从任意根节点出发并到达p的有向路径时,称p是可达的。不可达点对应于垃圾。
  • 垃圾收集器即维护可达图的某种表示,并定期回收不可达点。
  • 标记阶段(Mark)标记出根节点的所有可达和已分配的后继,清除阶段(Sweep)释放每个未被标记但已分配的块。

复制收集(Copy and Collection)

原理

将所有没有死亡的对象复制到新的空间中,然后将旧的空间废弃掉,就可以将死亡对象所占用的空间一口气全部释放出来,而没有必要再次扫描每个对象。下次GC的时候,现在的新空间也就变成了将来的旧空间。

算法中,会将从根开始被引用的对象复制到另外的空间中,然后,再将复制的对象所能够引用的对象用递归的方式不断复制下去。

分代回收

分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。具体来说,包括以下特点:

  • 最近被分配内存空间的对象最有可能需要被释放。

    在方法被执行前,通常需要为该方法所使用到的对象分配内存空间,搜索最近被分配的对象集合有助于花费最少的工作来释放进可能多的空闲内存空间。
  • 生命期最长的对象需要释放的可能性最小。

    在通过几轮垃圾回收后仍然存在的对象不大可能是那种能够在下一轮回收中被释放的临时对象,搜索这些内存块往往要进行大量的工作,却只能释放很小一部分的内存空间。
  • 同时分配内存的对象通常也会同时使用。

    将同时分配内存的对象存储位置彼此相连有助于提高缓存性能。

因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。

Python中的GC

Python中的垃圾回收是以引用计数为主,标记-清除和分代收集为辅。引用计数最大缺陷就是循环引用的问题,所以Python采用了辅助方法,具体可以参考这篇博文。

多线程Python 程序运行得比其只有一个线程的时候还要慢?

这是大多数Python程序员有过疑问的问题,网上也有了大量的回答,包括最经典的标准答案:“不要使用多线程,请使用多进程”。在所有的保留GIL的理由中,移除GIL会较大幅度地减低单线程程序的速度可能是最重要的了。

上面提到,Python采用的是以引用计数为主垃圾回收机制,在多线程环境下,需要使用加锁等并发控制机制保证引用计数的独占操作,而GIL对诸如当前线程状态和为垃圾回收而用的堆分配对象这样的东西的访问提供着保护,从而保证了单线程程序的高效。

Python有着很多不带GIL的解释器,这些解释器能够带来更好的多线程性能。此外,当然你真的需要充分利用多核的速度优势,此时python可能并非你最佳的选择,请考虑别的语言吧,如C++,Java,erlang 等。

C#与Java中的GC

值类型与引用类型区别

  • 值类型存储在栈中,栈通常使用的一级缓存,存取速度较快

  • 引用类型存储在堆中,栈中存放的是堆中数据存放的地址(root),堆通常使用的二级缓存,存取速度较慢

C#与Java中,采用的是分代的GC策略,分代垃圾回收采用分治的思想,进行代的划分,把不同生命周期的对象放在不同代上,不同代上采用最适合它的垃圾回收方式进行回收。

.NET框架中的垃圾回收器将分配的对象划分为3代。分别为0、1、2代。参考博文

Java中分为年轻代、年老代、持久带。参考博文

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 mac地址被过滤了怎么办 续贷声明含非法字符怎么办 辞职老板不给结工资怎么办 辞职后老板不发工资怎么办 联想手机不自带系统升级怎么办 苹果6玩崩坏3卡怎么办 机票名字打错了怎么办? 安装软件后显示名字乱码怎么办 户口上民族错了怎么办 改名字后行驶证怎么办 眼角撞到了肿了怎么办 想不想修真邪气怎么办 进户门比房间门低怎么办 吃了药反胃想吐怎么办 药吃了胃难受怎么办 吃了牙痛药胃痛怎么办 吃了药刺激胃怎么办 吃凉的刺激到胃怎么办 误食打农药的菜怎么办 狗把蛇咬死了怎么办 吃过毒死的狗怎么办 偷用室友东西被发现怎么办 室友看综艺太吵怎么办 被甲鱼咬住不放怎么办 凤仙叶子干焦怎么办 香槟开了没喝完怎么办 土豆酸了吃了怎么办 吃了发酸的土豆怎么办 土豆没煮熟吃了怎么办 吃了发绿的土豆怎么办 孩子吃蒸土豆发恶心怎么办 吃了发麻的土豆怎么办 吃了没熟的土豆怎么办 吃土豆没熟中毒怎么办 吃小土豆能中毒怎么办 猪吃土豆中毒了怎么办 吃了不熟的土豆怎么办 吃了变绿的土豆怎么办 吃炸洋芋中毒了怎么办 脸上长毒气痘痘怎么办 吃鸡游戏中遇到毒气怎么办