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 位上的 JDK 1.7.0_09 64 位,JRuby 1.7.2

使用的命令行:

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 上将 JRuby 与 indy 一起使用?

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 回答