[ANN] JRuby 1.5.5 Released

What output are we supposed to see? I just installed 1.5.5 and --profile doesn't seem to generate anything.

$ jruby -v
jruby 1.5.5 (ruby 1.8.7 patchlevel 249) (2010-11-10 4bd4200) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_22) [amd64-java]

···

On 11/10/2010 08:06 AM, Thomas E Enebo wrote:

We also improved the output
and accuracy of --profile (try it out).

Yeah, sorry about that. There's an update to the jruby-launcher gem
(our native executable) that has not gotten released yet. If you like
you can build it yourself from the repo at
github.com/vvs/jruby-launcher (make ; cp jruby <jruby home>/bin) to
get the new --profile flag.

Catching up from the conference backlog these past couple months :slight_smile:

- Charlie

···

On Wed, Nov 10, 2010 at 1:11 PM, Joel VanderWerf <joelvanderwerf@gmail.com> wrote:

What output are we supposed to see? I just installed 1.5.5 and --profile
doesn't seem to generate anything.

$ jruby -v
jruby 1.5.5 (ruby 1.8.7 patchlevel 249) (2010-11-10 4bd4200) (Java
HotSpot(TM) 64-Bit Server VM 1.6.0_22) [amd64-java]

Actually, all you need to do is "gem install jruby-launcher" to get
the new version.

/Nick

···

On Fri, Nov 19, 2010 at 12:50 AM, Charles Oliver Nutter <headius@headius.com> wrote:

On Wed, Nov 10, 2010 at 1:11 PM, Joel VanderWerf > <joelvanderwerf@gmail.com> wrote:

What output are we supposed to see? I just installed 1.5.5 and --profile
doesn't seem to generate anything.

$ jruby -v
jruby 1.5.5 (ruby 1.8.7 patchlevel 249) (2010-11-10 4bd4200) (Java
HotSpot(TM) 64-Bit Server VM 1.6.0_22) [amd64-java]

Yeah, sorry about that. There's an update to the jruby-launcher gem
(our native executable) that has not gotten released yet. If you like
you can build it yourself from the repo at
github.com/vvs/jruby-launcher (make ; cp jruby <jruby home>/bin) to
get the new --profile flag.

Catching up from the conference backlog these past couple months :slight_smile:

Thanks! Should this be installed with MRI gem, or jruby gem ?

···

On 11/19/2010 09:55 AM, Nick Sieger wrote:

Actually, all you need to do is "gem install jruby-launcher" to get
the new version.

JRuby! It will compile the native launcher for your system and install
it on top of the existing shell script in $JRUBY_HOME/bin.

/Nick

···

On Fri, Nov 19, 2010 at 2:58 PM, Joel VanderWerf <joelvanderwerf@gmail.com> wrote:

On 11/19/2010 09:55 AM, Nick Sieger wrote:

Actually, all you need to do is "gem install jruby-launcher" to get
the new version.

Thanks! Should this be installed with MRI gem, or jruby gem ?

Works now, thanks!

I'm looking at the output from both --profile and --sample. It seems that --profile measures only jruby methods, and --sample measures only java functions. (Or maybe --sample would show some of the jruby methods if they were taking enough time to be observed at a tick. My program is much more heavily bottlenecked in the java side at the moment.)

Is there any possibility of --profile instrumenting both jruby and java code?

···

On 11/19/2010 03:23 PM, Nick Sieger wrote:

On Fri, Nov 19, 2010 at 2:58 PM, Joel VanderWerf > <joelvanderwerf@gmail.com> wrote:

On 11/19/2010 09:55 AM, Nick Sieger wrote:

Actually, all you need to do is "gem install jruby-launcher" to get
the new version.

Thanks! Should this be installed with MRI gem, or jruby gem ?

JRuby! It will compile the native launcher for your system and install
it on top of the existing shell script in $JRUBY_HOME/bin.

Currently, no. Because Ruby dispatches differently than Java,
including both in the same profile is at least difficult, and maybe
impossible. Liken it to wanting to show profile results for both Ruby
and C (or C++, C#, ObjC) in other implementations, when Ruby method
dispatch is actually implemented *in* those native languages. The two
worlds are largely separate.

However...

If you are able to force all Ruby code to compile before invocation
(using -X+C to force all files to compile or -Xjit.threshold=1 to
force all methods to compile on first invocation) normal Java
profiling tools will show the compiled Ruby method bodies alongside
regular Java method bodies. Be forewarned, however...as with any C or
C++-based implementation that JITs Ruby code to native code, the
resulting method are "mangled" a bit, and you'll have to do some
manual chewing to interpret them. But at least you can use any of the
dozens of Java profiling tools and show results for both Ruby and Java
at the same time. If there's interest, I could try to do a screencast
of how to do this with various JVM profilers (such as the built-in
-J-Xrunhprof:cpu=times):

➔ jruby -J-Xrunhprof:cpu=times -e "def foo; a = 0; while a < 1000; a
+= 1; end; end; 100.times { foo }"
Dumping CPU usage by timing methods ... done.

Result, buried in a java.hprof.txt file: 728666’s gists · GitHub

Here, the "ruby.__dash_e__.method__0$RUBY$foo" method is the jitted
version of the "foo" method defined above.

Now, on JRuby 1.6, it may be possible to take this mangled output and
at least do a cleanup pass (because we have standardized the mangling
a bit better), but the profiling output is very tool-specific...so
de-mangling would have to happen on a per-tool basis

Another option would be the JXInsight tool
(http://www.jinspired.com/products/jxinsight/\), which has builtin
support for profiling Ruby (and may make it possible to combine Ruby
and Java results in the same output. It is, however, a commercial
tool.

- Charlie

···

On Fri, Nov 19, 2010 at 5:56 PM, Joel VanderWerf <joelvanderwerf@gmail.com> wrote:

I'm looking at the output from both --profile and --sample. It seems that
--profile measures only jruby methods, and --sample measures only java
functions. (Or maybe --sample would show some of the jruby methods if they
were taking enough time to be observed at a tick. My program is much more
heavily bottlenecked in the java side at the moment.)

Is there any possibility of --profile instrumenting both jruby and java
code?