Java 7已经粉墨登场了,这次带来的新功能感觉有些普普通通,当然还是有几个重要改进。那么对于在Java 7上运行的JRuby,我们能够期待些什么呢? Java 7改变了什么? Java 7中最大的改变和Java语言本身并没有什么关系。当然,Java 7中的“project coin”提高了Java语言的异常处理能力,还有新的数字、数组、哈希常量、开发者们经常要求的“字符串开关(strings in switch)”支持,还有一些别的东西等等。但这些都是些综合性的功能提高,真正的革新出现在JVM和JDK级别。 新的字节码Invokedynamic Java 7中最重要的变化是加入了一种新的字节码——invokedynamic——还有一个API,用来建立“方法句柄(method handle)”序列来支持这个字节码。 你可以把invokedynamic看做JVM用户与后台的JVM进行直接沟通的途径。方法句柄可以同时作为函数的pointer和 combinator,允许用内置的方式建立一个从调用器到被调用者的调用协议。通过invokedynamic,你可以移除参数、插入新的参数、处理现 有参数以及返回值,还可以用来捕获异常。Invokedynamic字节码本身提供了一个字节码级别的钩子,你可以把方法句柄序列附加在上面,这样在道理 上JVM就可以直接进入invokedynamic的调用器对序列进行优化。 通过invokedynamic,让JVM能够直接穿透复杂的方法调用逻辑的原因是tl;dr,其他动态语言也经常这样做,还可以把逻辑优化为就像通常的静态调用。 JRuby的master branch已经大量利用到invokedynamic的好处了,通过invokedynamic操作引导大多数的Ruby函数调用。对于简单路径和那些 通过Hotspot(OpenJDK的核心VM)优化的函数,invokedynamic通常能够提供150%到200%的性能提升,编写函数的工作也变 得更快更方便。对于其他一些没有经过OpenJDK 7 “dot zero”版本优化的路径,invokedynamic的表现没有那么好,因此在这里还有提升的空间。 因为JRuby早已开始使用invokedynamic,所以你现在就可以试试它了: 1. 从master开始建立自己的JRuby。 2. 从Oracle下载OpenJDK 7。 3. 在新的JDK中指向JAVA_HOME,开始试用JRuby。 NIO.2 NIO指的是Java的“New IO”API,这里包裹着一套低级别的文件说明符逻辑和内存缓冲。NIO在Java 1.4中就出现了,但最近升级为NIO.2,带来了一些迫切需要的功能: 文件系统操作(比如symlink和permission等等)现在几乎都可以通过NIO.2的文件系统API来完成。同时还包含了对文件系统事件的标准的跨平台支持,比如观察目录变化(有效使用OS级别操作而非轮询)等等事件操作。 文件和目录的walk操作占用的系统开销得到了大量降低,用于过滤目录时也有了更多的选项。 大多数的IO通道类型现在都拥有了异步版本。在这里,异步的意义在于“把IO操作放到内置的线程池”,通过代码检查操作状态,获得“未来”句柄结果。 对于JRuby来说,新的IO API意味着我们可以支持更多的跨平台文件系统操作,而不用生成原始码。同时它还能够提供给JRuby用户处理文件系统事件和异步IO操作功能,而不需要 使用专用的平台库。JRuby的核心类目前还没有开始添加NIO.2支持,但很快就会开始。 综合改进 在OpenJDK中还有很多小改进,它们不那么显眼,但对JRuby也很有帮助。 即使没有invokedynamic,最新的OpenJDK 7也比OpenJDK 6要强上不少。一些评测已经证实大概速度能够快上两倍,我们只需要升级JVM即可。OpenJDK 7的综合改进看上去普普通通,但几乎在我们测试到的每一个方面,结果都很令人满意。 OpenJDK 7的发布也带来了“阶梯式(tiered)”编译模式的进步。阶梯式编译模式的目标是把“client”模式(带来最快的初始化速度)和“server” 模式(带来最大的峰值性能)加以合并,你可以使用-XX:+TieredCompilation来开启阶梯编译。 这些综合改进意味着即使是JRuby 1.6.x这些版本的用户都能够开始使用OpenJDK 7最新带来的种种好处了,在JRuby 1.7中,这些改进的效果显然会更加明显。 兼容性 和从前其他版本的Java发行时一样,人们都会做出大量的小心翼翼的工作来确保现有的应用能够正常运行。Java 7也没什么不同。我们已经一遍遍的测试Java 7一年多了,在兼容性方面一直表现稳定,即使是最近大量使用invokedynamic的情况下。 在JRuby中,我们没有针对Java 7做出什么主要的改动,目前看来不会出现什么兼容性问题。 |