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支持,但很快就会开始。 |