jrubyc не работает с параметрами invokedynamic в linux

Я сделал все хорошо в окне, но не в Linux. Что я хочу сделать, так это скомпилировать скрипт ruby ​​​​в байт-код java с параметрами -Xcompile.invokedynamic=true:


        [sxu3@** rubyscript]$ jrubyc -Xcompile.invokedynamic=true hello.rb
        OptionParser::InvalidOption: invalid option: -Xcompile.invokedynamic=true
             complete at /homes/sxu3/tools/jruby-1.7.10/lib/ruby/1.9/optparse.rb:1542
               catch at org/jruby/RubyKernel.java:1282
            complete at /homes/sxu3/tools/jruby-1.7.10/lib/ruby/1.9/optparse.rb:1540
         parse_in_order at /homes/sxu3/tools/jruby-1.7.10/lib/ruby/1.9/optparse.rb:1380
               catch at org/jruby/RubyKernel.java:1282
          parse_in_order at /homes/sxu3/tools/jruby-1.7.10/lib/ruby/1.9/optparse.rb:1347
              order! at /homes/sxu3/tools/jruby-1.7.10/lib/ruby/1.9/optparse.rb:1341
            permute! at /homes/sxu3/tools/jruby-1.7.10/lib/ruby/1.9/optparse.rb:1432
              parse! at /homes/sxu3/tools/jruby-1.7.10/lib/ruby/1.9/optparse.rb:1453
        compile_argv at /homes/sxu3/tools/jruby-1.7.10/lib/ruby/shared/jruby/compiler.rb:83
          initialize at /homes/sxu3/tools/jruby-1.7.10/lib/ruby/1.9/optparse.rb:882
        compile_argv at /homes/sxu3/tools/jruby-1.7.10/lib/ruby/shared/jruby/compiler.rb:35
              (root) at /homes/sxu3/tools/jruby-1.7.10/bin/jrubyc:5
    [sxu3@** rubyscript]$ jrubyc -Xcompile.invokedynamic=true hello.rb ^C
    [sxu3@** rubyscript]$ which jrubyc
    ~/tools/jruby-1.7.10/bin/jrubyc
    [sxu3@** rubyscript]$ jruby -v
    jruby 1.7.10 (1.9.3p392) 2014-01-09 c4ecd6b on Java HotSpot(TM) Server VM 1.7.0_51-b13 [linux-i386]
    [sxu3@** rubyscript]$


    [sxu3@** rubyscript]$ uname -a
    Linux .. 2.6.32-358.23.2.el6.x86_64 #1 SMP Wed Oct 16 18:37:12 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

Без -Xcompile.invokedynamic=true jrubyc работает, но ни одна из инструкций invokedynamic не находится в сгенерированных байт-кодах. Также,

      "jrubyc -Xcompile.invokedynamic=true hello.rb" 

работает в окне, и я видел invokedynamic в файле класса в окне.

Я оставляю все остальные свойства jrubyc (.jrubyrc) в качестве значения по умолчанию.

hello.rb — это однострочный ruby-скрипт:

   puts "hello world"

Я также пробовал jrubyc 1.7.6 и те же ошибки. Кто-нибудь может дать какую-нибудь подсказку?

[Обновлять]:

Наконец, я думаю, что исключение указывает на то, что jrubyc не поддерживает параметр -Xcompile.invokedynamic=true. На вики-странице jruby написано, что jruby вместо «jrubyc» может работать с опцией.


person shijie xu    schedule 20.01.2014    source источник


Ответы (1)


У меня также были проблемы с jruby и invokedynamic. Проблема в том, что invokedynamic на самом деле не поддерживается в JVM 1.7. Чтобы заставить его работать, вы должны установить JVM 1.8. Вы можете прочитать о проблемах здесь: https://github.com/jruby/jruby/wiki/PerformanceTuning Но будьте осторожны при установке Java 8 — переключение между версиями не так просто, и некоторые программы, такие как несколько IDE eclipse, не хотят работать на этой JVM.

Однако, возможно, jruby с invokedynamic работает в Windows, потому что вы установили Oracle JVM, которая немного отличается от версии HotSpot OpenJDK.

person Thorben    schedule 21.01.2014
comment
На страницах говорится, что invokedynamic отключен по умолчанию в Java 7, но его можно включить с помощью -Xcompiler.invokedynamic=true: для приложений, которые не сталкиваются с ошибками или не снижают производительность, для максимальной производительности рекомендуется invokedynamic. Его можно принудительно включить, передав -Xcompile.invokedynamic=true в JRuby (или в JRUBY_OPTS) или установив свойство jruby.compile.invokedynamic=true на уровне JVM. Мы рекомендуем тщательно протестировать ваше приложение с включенным invokedynamic, прежде чем включать его в рабочих настройках. - person shijie xu; 21.01.2014
comment
Да, я думаю, что это слишком оптимистично. У меня не работало с самыми простыми скриптами. Ладно, это была версия 1.7.2, но документация была та же. Тем не менее, не рекомендуется использовать его без Java 8, но если вы действительно хотите, чтобы он работал в Linux, попробуйте установить Oracle JVM (если он работал с ним в Windows). - person Thorben; 21.01.2014