老大们觉得 JRuby 的 gc 好等等,决定上 JRuby on Rails,有没有有经验的同志介绍一下都有些什么坑啊
http://huangzhimin.com/2012/11/14/jruby-at-openfeint-jruby-migration-success-story/ 参考一下经验,目前大家遇到的问题是一下有 C 依赖的 Gem 包直接用 jruby 调用效率低下。可以多和上游社区多做反馈,做一下 patch 就能解决。不能解决的模块拆出来使用 SOA 架构分离。你的项目可以一开始就在单纯的 rails 上开发,然后做 JRuby 集成测试来找问题。附上的链接也是通过测试来验证选型的。
视频可以过来这里看,http://ruby-china.org/topics/7264,上面有说遇到的一些坑以及他们是如何解决的(依稀记得是要解决 json 数据的 hashcode 不相同的问题)
@xds2000 C 扩展慢的问题不好解决吧?
Ruby 写 C 扩展很容易的一个原因是 Ruby 的 GC 是保守式 GC, 保守式 GC 可以通过扫描栈获得变量存活信息而不用在 C 代码中手动释放对象.
而 JNI 完全就不是这么回事,你要各种手动 JNIEnv->releaseXXX
, 而且对象进入到 C 实现的代码中前,指针会在内存中 pin 住,直接脱离 GC 的 compact 阶段...
这种异构导致要么得用 Java 重写相应的 C 扩展,要么得在调用前走好厚的 FFI 包装,本来能变快的东西却变慢了...
2.0-preview1 的 ChangeLog 里有:
sat Jan 7 22:25:50 2012 Narihiro Nakamura [email protected]
- gc.c: use Bitmap Marking algorithm to avoid copy-on-write of memory pages. See [ruby-dev:45085] [Feature #5839] [ruby-core:41916].
但 1.9.3-p327 没有
另外 1.9.3 已经是使用了 lazy-sweep 手段的增量式 gc, 不会有像 1.8 那样的卡住的情况了
再另外同样是这个作者 nari 已经做了 parallel gc 的原型,据称可以提升 40% 左右的 gc 速度
建议关注一下 Charles Oliver Nutter twitter @headius , 看看今天贴出来的 jruby profile 的一个脚本。 https://gist.github.com/4343186
一个月后再回来,JRuby 本身如何还无法判断,但是和公司原有的开发和部署环境集成太痛苦了,包的版本,用公司的一些包的问题,关键是还得在 Ruby 中调用 Java 代码,实在是相当难看!