BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

采用位图标记技术的垃圾收集器将会大幅改善内存占用

| 作者 Mirko Stocker 关注 0 他的粉丝 ,译者 杨晨 关注 0 他的粉丝 发布于 2012年2月11日. 估计阅读时间: 3 分钟 | CNUTCon 了解国内外一线大厂50+智能运维最新实践案例。

Ruby 1.9.3最重要的特性就是引入了惰性垃圾收集清理器,这项工作是由中村成洋(InfoQ此前有过相关报道)完成的,它极大地降低了最坏情况下垃圾收集器所需要的时间。在近期的一份文档中,中村成洋表示他已经实现了写时拷贝的位图标记垃圾收集器(简记bmap),这个收集器和Ruby企业版的写时拷贝垃圾收集器很类似,都是通过使用POSIX的fork系统调用来降低内存需要,这个调用的巧妙之处在于让子进程共享父进程的内存,除非有修改才会拷贝。不幸的是,当前的Ruby收集器并没有很好地利用这个特性

Ruby使用的是标记清除垃圾收集技术。这项技术的特点是,垃圾收集器首先会遍历所有的对象,然后标记哪些正在使用,即设置FL_MARK标记位。然后收集器将会再遍历所有的对象,删除没有被标记的对象,并且释放空间。不过,问题是,这种技术和写时拷贝逻辑上有冲突:收集器可能会把所有的页都标记为脏。

InfoQ联系了了中村成洋,希望得知他的bmap实现是如何改善现有惰性垃圾收集器的缺陷。他指出,位图标记算法拥有如下几个优点:

  • 相比每个对象有个头部位标记,位图对存储空间利用更加高效
  • 高局部性
  • 标记不会修改任何对象。而且清理也不会修改任何活动对象
  • 非常适合写时拷贝,脏缓存行很少
  • 我们使用memset来重置标记位
  • 清除操作将会快一些

在CRuby中,写时拷贝是非常重要的。Linux环境下,位图标记技术将会显著改善使用fork程序的内存使用情况。而且在CRuby中,使用fork可以大幅提高并行性能。不仅如此,在库支持方面,也有很多采用了fork的库可供使用。(例如UnicornResque

InfoQ:但是从性能方面来看,惰性垃圾搜集器降低了吞吐量,而且bmap也比当前的垃圾收集器略微慢一些。bmap将会代替现有的垃圾收集器么?或者开发者和用户可以通过配置来选择使用哪种垃圾收集器?

我的计划是位图标记垃圾收集器将会是默认的垃圾收集器。至于你所提到的“bmap略微慢一些”,的确是这样,不过,我认为性能下降程度仍然是在所有人可以接受的范围内。所以,我觉得用户并不需要这样的配置。

InfoQ:你也提到了你准备将位图标记技术应用到并行垃圾收集器中。听起来这将会大幅提高垃圾收集器性能,你能否透露一下这项技术将能够能够提高大概多少性能么(或者减少多少停顿时间)?

事实上我已经编写出了无位图标记技术的并行垃圾收集器。在某些情况下,我能够将运行在双核机器上的垃圾收集器性能提高40%。应用位图标记技术之后,性能只会有微量降低。

我在RubyConf US 2011上已经详细地阐述了并行垃圾收集器(视频幻灯片)。

松本行弘也将位图标记垃圾收集器提交到了Ruby代码库中,它将会随着下一个版本一同发布,我们认为这个版本将会是2.0版。

查看英文原文:Bitmap Marking GC for Ruby Improves Memory Usage

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT