我使用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它可以工作,但在另一个项目中使用classfiles时遇到了问题。
有没有人想知道如何解决它? 如何在Java 7上使用JRuby和indy?
答案 0 :(得分:0)
除了JRuby方便参数--server,所有JVM运行时 参数使用-J选项,后跟特定的JVM设置。 例如:
堆空间设置:jruby -J-X
JRuby运行时设置:jruby -J-D
以下各节中描述的所有设置均为JVM设置。
https://github.com/jruby/jruby/wiki/PerformanceTuning
试试这个
jruby -J-Xcompile.invokedynamic=true -S jrubyc duck_typing.rb