ホーム   »  スポンサー広告  »     »  Java  »  Ruby から Java を呼ぶ方法

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Ruby から Java を呼ぶ方法

Rjb を使用して Ruby から Java のライブラリを使用する方法について記述します。

まず gem を使用して Rjb をインストールします。この時 JNI 周りのコンパイルが行われるため C コンパイラが必要です。

torao@safran$ export JAVA_HOME=/usr/java/jdk1.6
torao@safran$ gem install rjb
Building native extensions.  This could take a while...
Successfully installed rjb-1.3.4
1 gem installed

Rjb のインストールが完了したら irb を使用して Java からシステム時刻を取得します。

torao@safran$ irb
irb(main):001:0> require "rubygems"
=> true
irb(main):002:0> require "rjb"
=> true
irb(main):003:0> Rjb::load
=> nil
irb(main):004:0> System = Rjb::import("java.lang.System")
=> # nil

おおっ、実行できましたね!

Rjb::load について。 第一引数に

メモリの増加量

Rjb は JNI を使用して Java VM をプロセスにアタッチしているため、Ruby プロセスのメモリ使用量が Java VM 分だけ増加します。以下 CentOS 5.5 + Ruby 1.8 + Java SE 1.6 についてのメモリ消費量を調べてみます。

torao@safran$ uname -a
Linux safran 2.6.18-194.el5xen #1 SMP Fri Apr 2 16:16:54 EDT 2010 i686 i686 i386 GNU/Linux
torao@safran$ java -version
java version "1.6.0_23"
Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
Java HotSpot(TM) Client VM (build 19.0-b09, mixed mode, sharing)
torao@safran$ ruby -version
ruby 1.8.7 (2010-12-23 patchlevel 330) [i686-linux]
torao@safran$ irb
irb(main):001:0> require "rubygems"
=> true
irb(main):002:0> print `ps aux | grep irb | grep -v grep`
torao    19925  0.3  0.2   7560  6056 pts/0    S+   12:43   0:00 irb
=> nil
irb(main):004:0> require "rjb"
=> true
irb(main):006:0> Rjb::load
=> nil
irb(main):007:0> print `ps aux | grep irb | grep -v grep`
torao    19925  0.1  0.7 417540 15672 pts/0    Sl+  12:43   0:00 irb
=> nil

Java VM をロードした時点で RSS が 9,616MB、VSZ が 409,980MB 増加しています。この値は Java VM がクラスをロードしヒープにデータを起き始めるとさらに増加します。以下は Apache Tika を使用して Word 2007 のファイルから文字列を取得する場合について。

torao@safran$ irb
irb(main):001:0> require "rubygems"
=> true
irb(main):002:0> print `ps aux | grep irb | grep -v grep`
torao    19998  0.5  0.2   7560  6052 pts/0    S+   12:52   0:00 irb
=> nil
irb(main):003:0> require "rjb"
=> true
irb(main):004:0> Rjb::load("tika-app-0.9.jar")
=> nil
irb(main):005:0> File = Rjb::import("java.io.File")
(irb):5: warning: already initialized constant File
=> #
irb(main):006:0> Tika = Rjb::import("org.apache.tika.Tika")
=> #
irb(main):007:0> tika = Tika.new()
=> #
irb(main):008:0> print tika.parseToString(File.new("test.docx"))
テスト
=> nil
irb(main):009:0> print `ps aux | grep irb | grep -v grep`
torao    19998  2.7  2.0 422680 42028 pts/0    Sl+  12:52   0:01 irb
=> nil

RSS で 35,976MB、VSZ で 415,120MB の増加が見られます。

個人的な経験則ですが、Ruby のみならず JNI を使用して多言語から Java VM を使用する場合では最低 +64MB のメモリ増加を想定しておいた方が良いかと思います。

コメント
トラックバック
トラックバック URL
コメントの投稿
管理者にだけ表示を許可する
Profile
Takami Torao
Takami Torao
C/C++ 使いだった 1996年、運命の Java と出会い現在に至る。のらアーキテクト。
Yah, this is image so I don't wanna eat spam, sorry!
Search

Google
MOYO Laboratory
Web

カテゴリー
最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
ブロとも申請フォーム
RSSフィード
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。