写点什么

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

  • 2008-02-26
  • 本文字数:1539 字

    阅读完需:约 5 分钟

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

2008-02-26 03:11864
用户头像

发布了 33 篇内容, 共 54852 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

通用数据保护条例的监管下,你的数据湖“断舍离”了吗?

亚马逊云科技 (Amazon Web Services)

分析

“你最崇拜的人是谁”,从面试问题看标杆学习法

编程江湖

面试题

体育锻炼的好处

Tiger

28天写作

读《思辨与立场》-08设计你的人生

wood

28天写作 批判性思维 思辨与立场

如何摆脱机房教师控制?

喀拉峻

网络安全 安全 信息安全 计算机

Go 的 golang.org/x/ 系列包和标准库包有什么区别?

AlwaysBeta

golang Go 语言

外贸订单回暖,集装箱持续爆舱,低代码或将成外贸行业新财富密码

优秀

低代码 外贸管理

Amazon Timestream 在车联网场景的典型应用和性能测试

亚马逊云科技 (Amazon Web Services)

分析

kafka的JavaAPI操作

编程江湖

大数据

轻松搭建数据仓库,与FreeWheel一起“玩转”Amazon EMR

亚马逊云科技 (Amazon Web Services)

分析

在线JSON转toml工具

入门小站

工具

使用Amazon RDS for Oracle配合Oracle Active Data Guard建立托管的灾难恢复与只读副本

亚马逊云科技 (Amazon Web Services)

分析

使用 Amazon Athena 做漏斗分析——实现更高效的数据湖检索

亚马逊云科技 (Amazon Web Services)

分析

互联网行业办理过等保业务,选择哪款堡垒机好?

行云管家

互联网 网络安全 堡垒机 云堡垒机

大数据开发 Spark 模块之SparkSQL

@零度

大数据 spark Sparksql

在Amazon SageMaker上快速、灵活构建TensorFlow模型的在线推理服务

亚马逊云科技 (Amazon Web Services)

分析

风云叱咤,尚硅谷云原生实战教程(下篇)发布

编程江湖

Java 开发

技术分享| 如何快速实现音视频在线通话

anyRTC开发者

音视频 语音通话 视频通话 呼叫邀请 离线推送

Amazon Redshift ML现已正式推出——使用SQL创建机器学习模型并通过您的数据进行预测

亚马逊云科技 (Amazon Web Services)

分析

面对持续不断生成的流数据—— Amazon Kinesis Data Analytics 实现及时分析与处理

亚马逊云科技 (Amazon Web Services)

分析

Vue.js关于响应式部分的优化

编程江湖

前端开发

使用 Python Poetry 进行依赖管理

华为云开发者联盟

Python Python Poetry 依赖项管理 Poetry

2022 年最有前景的 5 个 Web IDE

开源之巅

开发者工具 WebIDE

2022 用好这 8 个工具,提升前端工程师软技能

开源之巅

Web 前端开发

推出Amazon Kinesis Data Analytics Studio —— 与流数据快速交互

亚马逊云科技 (Amazon Web Services)

分析

通过Amazon SageMaker与Amazon Step Functions实现机器学习的CI/CD 方案

亚马逊云科技 (Amazon Web Services)

分析

借助Amazon EMR与外部KDC进行身份认证,有效集成业务场景

亚马逊云科技 (Amazon Web Services)

分析

直播预告丨和我们一起过圣诞吧!Hackathon 创意攻略等你查收

PingCAP

​虚幻引擎5更新:头部工作室如何使用Perforce Stream实现虚幻升级

龙智—DevSecOps解决方案

虚幻引擎 虚幻引擎5 UE5

模块7作业

panxiaochun

架构实战营

如何做好技术 Team Leader?

阿里技术

技术管理 技术人 内容合集

JRuby 1.1RC2发布,内存需求降低_Java_Werner Schuster_InfoQ精选文章