1

http://www.javaworld.com/javaworld/jw-07-2006/jw-0717-ruby.htmlの小さな Jruby スクリプトを使用して、invokedynamicをテストしました。

class ADuck
    def quack()
        puts "quack A";
    end
end

class BDuck
    def quack()
        puts "quack B";
    end
end

def quack_it(duck)
    duck.quack
end

a = ADuck.new
b = BDuck.new
quack_it(a)
quack_it(b)

しかし、JRuby で Java クラスファイルにコンパイルしてから実行しようとすると、次の例外が発生します。

Java HotSpot(TM) 64-Bit Server VM warning: Use -XX:+UnlockDiagnosticVMOptions be
fore EnableInvokeDynamic flag
Exception in thread "main" java.lang.ClassCastException: java.lang.Object cannot
 be cast to java.lang.invoke.SwitchPoint
        at     org.jruby.runtime.invokedynamic.InvokeDynamicSupport.constantFallback
(InvokeDynamicSupport.java:659)
        at duck_typing.__file__(duck_typing.rb:22)
        at duck_typing.load(duck_typing.rb)
        at duck_typing.main(duck_typing.rb)

私のシステム:Windows 7 64ビット、JRuby 1.7.2上のJDK 1.7.0_09 64ビット

使用したコマンドライン:

jruby -Xcompile.invokedynamic=true -S jrubyc duck_typing.rb
java -XX:+UnlockExperimentalVMOptions -XX:+EnableInvokeDynamic -cp .;jruby-complete-1.7.2.jar duck_typing

しばらく前に、Linux マシンと Windows jdk8 でテストしましたが、同じ結果が得られました。JDK8では機能しましたが、別のプロジェクトでクラスファイルを使用すると問題が発生しました。

誰かがそれを修正する方法を知っていますか? Java 7 の indy で JRuby を使用するにはどうすればよいですか?

4

1 に答える 1

0

JRubyコンビニエンスパラメーター--serverを除いて、すべてのJVMランタイムパラメーターは-Jオプションを使用し、その後に特定のJVM設定が続きます。例えば:

ヒープスペース設定:jruby -JX

JRubyの実行時設定:jruby -JD

次のセクションで説明するすべての設定は、JVM設定です。

https://github.com/jruby/jruby/wiki/PerformanceTuning

代わりにこれを試してください

jruby -J-Xcompile.invokedynamic=true -S jrubyc duck_typing.rb
于 2013-02-14T17:31:31.087 に答える