BT

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

JRuby 1.1RC2发布,内存需求降低

| 作者 Werner Schuster 关注 6 他的粉丝 ,译者 贾晓楠 关注 0 他的粉丝 发布于 2008年2月27日. 估计阅读时间: 5 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!
JRuby 1.1的第2候选发行版(RC2)已经发布了, 它相对RC1版做了很大改进:
- 在JRuby 1.1RC1的基础上解决了260个问题
- 大规模IO的重构
- 在内存方面对JIT编译的方法的改进:
   - 控制JIT编译出的方法总数
   - 支持一种用于各个运行时的JIT缓存来归还permgen
   - 减少了生成方法的代码长度(减少50-70%)
仅次于 Oniguruma Regex引擎的Java移植,JRuby 1.1相对于JRuby 1.0最显著的性能改进就是Just In Time (JIT)编译器的引入,它用来把Ruby代码编译成JVM字节代码。但是,它也得面对JVM语言实现需要对付的问题。

采用在JVM中管理字节代码的方式给JRuby的JIT带来了一些问题。在JVM中,类是字节代码最小的可装载单位——因此,如果一个Ruby方法被JIT编译,生成的代码就被放入一个新类的方法体中,然后被装载。然而,这正是一个潜在的问题源头和内存泄露者:字节代码被装入PermGen,一个垃圾收集段,它默认很小,通常是64MB。Nick Sieger说明了它会很快被JIT编译的Ruby方法填满:
例 如一个不算太简单的Rails应用程序,它充分使用Ruby标准库,还用了一大堆插件,由JRuby编译的方法轻易地超过了10,000个。倘若一个 JRuby方法类的平均开销大约是8K(当然根据方法的长度有所不同),他们就会占用80兆的permgen空间。(而JVM的permgen空间大小默 认是64兆字节,因此我们已经超过了这个限制)。
[..]
如果你在一个应用程序服务器上部署4个Rails程序,每个使用4个活动运行时的话,你就得面对1.2G字节的permgen空间需求!(一般来说,在Java应用程序服务器上运行多个程序很常见,但是要运行多个Rails程序可能需要重新考虑一下。)
这是个非常实际的问题——PermGen表现地很像常规的Java堆:它有固定的大小,一旦PermGen满了,就会抛出OutOfMemory异常,并最终导致JVM崩溃。

Nick Sieger解释了RC2中对这个问题的几个解决方案:
由于这个问题带来的消耗太大,在JRuby 1.1RC1发布不久,我们就采用了近乎激烈的手段把每个运行时都会进行JIT编译的方法的数量限制到2048个。但是过了不久就发现,很明显,即使使用 基于阈值的方法,JRuby还是浪费了大量的permgen空间,里面堆满了编译后的方法的重复拷贝。因此,在1.1RC2中,我们引入了一种JIT缓 存,它可以在多个运行时中共享。
这个问题的解决方案已经有了,就像 .NET平台上的动态方法那样。不是把Ruby方法编译成Java类的单一方法体,而是把字节代码存储在一个方法对象里——注意,是对象。这些动态方法表现得和常规对象一样,当它们不再被使用的时候,就会被回收。这种方法还用于减少大量的其他开销,John Rose解释道
动态语言实现的一个麻烦点是动态管理代码。开发者把注意力放在方法体和方法体与一些预期的调用序列之间的连接的时候,JVM需要大量上下文细节来把代码放到适当的位置。这些细节包括:
  • 方法名
  • 封装类名
  • 与其他命名实体相关的各种访问限制
  • 类装载器和保护域
  • 连接和初始化状态
  • 类分层结构的安置(即使类从来没有实例化)
这 些细节给开发者的任务添了不少麻烦,而且他们经常导致各方面的执行开销。因为一个命名的类(和类装载器)必须被精确定义,并在之后可以通过它的名字来回收 (通过Class.forName)。JVM必须把每一个新定义的类连接到它的定义类装载器和一个称为系统词典的数据结构,用于在以后处理连接请求。建立 连接需要一定的时间,尤其是当它们必须获得各种系统锁时。这些都令GC收集不用的代码变得很困难。
当然,像.NET中的动态方法这样的特色在JVM中没有实现。相关的研究正在Da Vinci Machine项目中进行,现在已经实现了原型,但是这样的特色要等到下一个Java版本发布时才能看到。

查看原文:JRuby 1.1RC2 released with reduced memory requirements

评价本文

专业度
风格

您好,朋友!

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

获得来自InfoQ的更多体验。

告诉我们您的想法

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

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

JRuby 小型应用效果很好 by sun blade

工作内部应用,小过很好。

允许的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通知我

1 讨论

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


找回密码....

Follow

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

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

Like

内容自由定制

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

Notifications

获取更新

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

BT