时隔16年Jeff Barr重返10.23-25 QCon上海站,带你看透AI如何重塑软件开发! 了解详情
写点什么

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:111155
用户头像

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

关注

评论

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

AIGC图生视频技术下的巴黎奥运高光时刻

阿里云CloudImagine

云计算 视频云 奥运会 AIGC 图片生成视频

深维智信Megaview携手豆包大模型,助力人人成为金牌销售

新消费日报

【YashanDB数据库】Ubuntu系统加载Yashan C驱动后无法使用PHP

YashanDB

yashandb 崖山数据库 崖山DB

义乌购API接口揭秘:轻松获取海量商品列表数据

tbapi

义乌购API 义乌购商品列表数据接口 义乌购API接口

手把手教你把PPT压缩到20M以内,这4个技巧办公必备!

职场工具箱

效率 职场 PPT 办公软件 AI生成PPT

12 个开源社区喊你跟通义灵码结伴编码,赢开源先锋大奖!

阿里巴巴云原生

阿里云 云原生 通义灵码

重塑购车体验,实时云渲染赋能东风日产探路云看车新体验

3DCAT实时渲染

实时云渲染 云3D渲染 汽车虚拟仿真 云看车

【网络安全】Web Hacking网络黑客手册,GitHub星标3.7K!

我再BUG界嘎嘎乱杀

黑客 网络安全 安全 信息安全 网安

Cobra 库上手—自建命令行工具

FunTester

1688商品详情API返回值:商品质量监控的利器

技术冰糖葫芦

api 货币化 API 接口 API 文档 API 测试

解析 Aethir 的代币经济学,如何成为其 DePIN 计算体系的驱动力?

股市老人

面试官:说说MySQL调优?

王磊

云消息队列 RabbitMQ 版入门训练营,解锁对比开源优势与零基础实战

阿里巴巴云原生

阿里云 云原生 RabbitMQ

什么是CC攻击?CC攻击怎么防御?

网络安全服务

黑客 https 服务器 DDoS DDoS 攻击

飞机机翼弹性不足、桥梁晃动频率过高,重要的流固耦合FSI如何用技术解决

Altair RapidMiner

设计 仿真 altair 人工智能、 飞机

面向 RAG 应用开发者的实用指南和建议

Zilliz

人工智能 AI 向量数据库 大语言模型 rag

生成式AI及其对API和软件开发的影响

幂简集成

AI API 生成式AI

7月新特性 | 软件开发生产线CodeArts发布多项新特性等你体验!

软件开发 华为云

一个难忘的json反序列化问题

不在线第一只蜗牛

json 反序列

“AI+Security”系列第2期(一):对抗!大模型自身安全的攻防博弈

云起无垠

管好“黄金数据”,浪潮海岳助力企业释放主数据潜能

inBuilder低代码平台

数据管理 主数据

活动回顾|首次 Cloudberry Database Meetup · 北京站成功举办

酷克数据HashData

数据库

终端增强技术实现真正落地!微帧科技与天猫精灵联手打造的精灵原画-AI视效增强,在居家Livehouse里,音画一体、跃级享受!

微帧Visionular

Deep-Live-Cam:只需单张图像即可实现人脸替换;零一万物、月之暗面再掀国产大模型资本战丨 RTE 开发者日报

声网

淘宝店铺商品API返回值中的商品库存与销量信息

技术冰糖葫芦

api 货币化 API 接口 API 文档 API 测试

AI魔术上演前夕,国产存储早已强势清场

脑极体

AI

Gather:开启绝密社交和收益双重惊喜之旅

股市老人

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