InfoQ

新闻

1.8.x的新修复解决了内存泄漏问题并改进了性能

作者 Werner Schuster 译者 张龙 发布于 2009年1月8日 下午12时24分

社区
Ruby
主题
性能和可伸缩性,
Ruby on Rails,
运行时
标签
Rails,
垃圾回收

就性能而言,目前Ruby 1.9.1和JRuby领导着Ruby的实现。然而由于种种原因,转到这两个实现中的任何一个都不是那么容易的事情,因为Ruby 1.9.x在有些地方与1.8.7不兼容,同时JRuby仍旧缺乏一些使用本地扩展的Ruby库。由于这个原因,MRI 1.8.x还会继续存在一段时间,那么我们可能对其性能的改进产生兴趣。

目前Brent Roman在一定程度上改进了Ruby 1.8.x MRI的性能。他正不断尝试着修复Ruby中的内存泄漏问题

基本的技术就是对Kurt Stephens所建议的一个问题的精化。它不仅消除了这行代码的泄漏问题:
loop {@x=callcc{|c|c}}
还消除了我们多线程机器人技术应用中的泄漏问题。过去我们所使用的Ruby进程在运行一天后常常达到20+MB,而现在已经降到了10MB以下。

正如其所示,泄漏是由GCC的优化所导致的:它与Ruby的旧式GC的交互很差劲

垃圾收集器的内存泄漏问题并不是它本身的错误。问题在于“C”机器栈(machine stack)中充满了对象引用。其主要原因是由于gcc编译器创建了过多大的stack frame而又没有对其初始化。用在Ruby解释器的核心递归表达式程序中的某些“C”构造会生成特别大而又稀疏的stack frame。函数rb_eval()就是最差劲的一个,它会为每次调用都创建KB大小的stack frame,而其又会调用自身几百次。这导致栈的容量急剧膨胀,经常充满了不再使用而又无法移除的对象引用。

Brent提供了一些修复(针对Ruby 1.8.7-patlevel72),目的在于解决这些问题。

当运行在真实世界的Rails应用上时,测试报告表明该修复对速度的提升效果很明显。同时也报告了一些问题,让我们对其拭目以待吧。

这些修复是开源(Ruby)社区对MRI改进的又一个证明。Mod_rails (或REE)已经是一个佐证了,它使得MRI的垃圾收集器更加友好(参见相关新闻以了解更多)。

MRI的性能在很大程度上取决于它的编译方式

今年你还打算继续使用Ruby 1.8.x么?如果是的话,理由呢?

查看英文原文:New Patches for 1.8.x Fix Memory Leaks And Improve Performance

这篇文章写的错误百出 发表人 Robbin Fan 发表于 2009年1月8日 下午10时4分
Re: 这篇文章写的错误百出 发表人 Xiaogang Guo 发表于 2009年1月12日 上午3时54分
Re: 这篇文章写的错误百出 发表人 Xiaogang Guo 发表于 2009年1月13日 上午4时5分
  1. 返回顶部

    这篇文章写的错误百出

    2009年1月8日 下午10时4分 发表人 Robbin Fan

    内存泄漏问题根本就不是GC优化导致的,而是幽灵指针引起的。 Brent Roman的MBARI patch也并非只能用在1.8.7上面,一旦该补丁被合并到trunk以后,他会后续提交1.9.1的patch。 这篇文章错误太多了,简直就是误导。看看我写的介绍吧: ruby内存泄漏的罪魁祸首 - 幽灵指针 解决ruby内存泄漏的超级大补丁发布啦

  2. 返回顶部

    Re: 这篇文章写的错误百出

    2009年1月12日 上午3时54分 发表人 Xiaogang Guo

    注意没有人说是“GC优化导致的”,文中说的是“GCC优化”。可能大写有误导吧。
    所谓“gcc optimizations”我想是指

    [...]gcc compilers create overly large stack frames and do not initialize many values in them[...]
    你所说的“幽灵指针”不就是来自这些没初始化的stack frames。这种做法最后怎么变成内存泄漏,你已经解释得很清楚。Brent的补丁说明里面也介绍得很清楚。

  3. 返回顶部

    Re: 这篇文章写的错误百出

    2009年1月13日 上午4时5分 发表人 Xiaogang Guo

    差点忘了谢谢Robbin Fan。
    多谢补充这两篇出色的介绍和1.9.1补丁的信息。

深度内容

和Google互补的搜索引擎Wolfram|Alpha

Wolfram|Alpha与Google究竟是什么关系,Wolfram|Alpha自己是如何定位的?Wolfram|Alaph在多大程度上是语义网搜索呢?InfoQ中文站就等等这些问题采访了Wolfram研究公司中国区商务经理王翔。

SOA契约成熟度模型

本文说明了所推荐的契约版本管理设计策略是如何与SOA成熟度模型发生联系的。文章目的是为实现版本管理和可组合性提供一个路线图。

数据服务简介

Vijay Narayanan在这篇文章中对数据服务的几个方面进行了介绍,它们都是SOA实践者和数据架构师感兴趣的内容。本文对数据服务的几个方面进行了介绍,包括需求定义,基本原理和好处、范围、开发以及消费模式。

分块云计算

在本文中,Jimmy Nilsson描述了一种他在过去数年间观察到的一种正在缓慢成长的架构风格,他把这种风格称为“分块云计算”。

豆瓣网技术架构变迁

罗马不是一天建成的,豆瓣的技术架构也是随着用户规模的增长一直在持续变化中。在本次演讲中,豆瓣的首席架构师洪强宁将与大家一起分享从上线时的单台服务器架构开始一直到现在的豆瓣架构变迁历程。

融合思想:深入探索S#arp架构

Billy McCafferty展示了S#arp架构,它在ASP.NET MVC框架的基础上,荟萃了当今的最佳实践,应用在ASP.NET Web应用程序的架构设计中。

王雷谈开源以及新兴市场计划

中国作为新兴市场中的新兴市场,是Sun在美国之外实施SSE(SUN Startup Essentials)项目重点关注的地区。在QCon Beijing 2009期间,InfoQ中文站有幸对此项目的负责人王雷先生进行了采访,探讨了关于开源、新兴市场、SSE等话题。

使用HTML5构建下一代的Web Form

HTML5 是由 WHATWG发起的,最开始的名称叫做Web Application 1.0,而后这个标准吸纳了Web Forms 2.0的标准,并一同被W3C组织所采用,合并成为下一代的HTML5标准。