《深入理解java虚拟机》第1章 走近Java
1.5 展望Java技术的未来在2005年,Java 语言诞生10周年的SunOne技术大会上,Java语言之父James Gosling做了一场题为“Java技术下一个十年”的演讲。笔者不具备James Gosling 博士那样高屋建瓴的视角,这里仅从Java平台中几个新生的但已经开始展现出蓬勃之势的技术发展点来看- -下后续1 ~ 2个JDK版本内的- -些很有希望的技术重点。1....
1.5 展望Java技术的未来
在2005年,Java 语言诞生10周年的SunOne技术大会上,Java语言之父James Gosling做了一场题为“Java技术下一个十年”的演讲。笔者不具备James Gosling 博士那样高屋建瓴的视角,这里仅从Java平台中几个新生的但已经开始展现出蓬勃之势的技术发展点来看- -下后续1 ~ 2个JDK版本内的- -些很有希望的技术重点。
1.5.1模块化
模块化是解决应用系统与技术平台越来越复杂、越来越庞大问题的一-个重要途径。 无论是开发人员还是产品最终用户,都不希望为了系统中一小块的功能而不得不下载、安装、部署及维护整套庞大的系统。站在整个软件工业化的高度来看,模块化是建立各种功能的标准件的前提。最近几年OSGi技术的迅速发展、各个厂商在JCP中对模块化规范的激烈斗争,都能充分说明模块化技术的迫切和重要。在未来的Java平台中,很可能会对模块化提出语法层面的支持。早在2007年,Sun公司就提出过JSR-277:Java模块系统(JavaModuleSystem),试图建立Java平台的模块化标准,但受挫于以IBM公司为主导提交的JSR-291:JavaSE动态组件支持(DynamicComponent Support for Java SE,这实际就是OSGi R4.1)。由于模块化规范主导权的重要性,Sun公司不能接受-一个无法由它控制的规范,在整个JavaSE6期间都拒绝把任何模块化技术内置到JDK之中。在JavaSE 7发展初期,Sun公司再次提交了一个新的规范请求文档JSR-294: Java 编程语言中的改进模块性支持(Improved Modularity Support in the Java Programming Language),尽管这个JSR仍然没有通过,但是Sun公司已经独立于JCP专家组在OpenJDK里建立了一个名为Jigsaw(拼图)的子项目来推动这个规范在Java平台中转变为具体的实现。Java 的模块化之争目前还没有结束,OSGi已经发布到R5.0版本,而Jigsaw从Java7延迟至Java8,在2012年7月又不得不宣布推迟到Java9中发布,从这点看来,Sun在这场战争中处于劣势,但无论胜利者是哪- -方,Java 模块化已经成为一项无法阻挡的变革潮流。
1.5.2 混合语言
当单一的Java开发已经无法满足当前软件的复杂需求时,越来越多基于Java虚拟机的语言开发被应用到软件项目中,Java 平台上的多语言混合编程正成为主流,每种语言都可以针对自己擅长的方面更好地解决问题。试想一下,在一个项目之中,并行处理Clojure语言编写,展示层使用JRuby/Rails,中间层则是Java,每个应用层都将使用不同的编程语言来完成,而且,接口对每一-层的开 发者都是透明的,各种语言之间的交互不存在任何困难,就像使用自己语言的原生API一样方便,因为它们最终都运行在-一个虚拟机之 上。在最近的几年里,Clojure、 JRuby、 Groovy 等新生语言的使用人数不断增长,而运行在; Java虚拟机(IVM):之士的语言数量也在迅速膨胀,图.1-4中列举了其中的一部分。这两点:证明混合编程在我们身边已经有所应用并被广泛认可。通过特定领域的语言去解决特定领域的问题是当前软件开发应对日趋复杂的项目需求的一个方向。。
除了催生出大量的新语言外,许多已经有很长历史的程序语言也出现了基于Java虚拟机实现的版本,这样使得混合编程对许多以前使用其他语言的“老”程序员也具备相当大的吸 引力,软件企业投入了大量资本的现有代码资产也能很好地保护起来。表1-1中列举了常见语言的JVM实现版本。
对这些运行于Java虚拟机之上、Java之外的语言,来自系统级的、底层的支持正在迅速增强,以JSR-292为核心的--系列项目和功能改进(如DaVinciMachine项目、Nashorn引擎、InvokeDynamic 指令、java.lang.invoke 包等),推动Java虚拟机从“Java语言的虚拟机”向“多语言虚拟机”的方向发展。
1.5.3多核并行
如今,CPU硬件的发展方向已经从高频率转变为多核心,随着多核时代的来临,软件开发越来越关注并行编程的领域。星在JDK 1.5 就已经引入java.util.concurrent包实现了-一个粗粒度的并发框架。而JDK 1.7 中加人的java.util.concurrent. forkjoin包则是对这个框架的一-次重要扩充。Fork/Join 模式是处理并行编程的一个经典方法,如图1-5所示。虽然不能解决所有的问题,但是在此模式的适用范围之内,能够轻松地利用多个CPU核心提供的计算资源来协作完成- - 个复杂的计算任务。通过利用Fork/Join模式,我们能够更加顺畅地过渡到多核时代。
一一在Java8中,将会提供Lambda支持,这将会极大改善目前Java语言不适合函数式编程的现状(目前Java语言使用函数式编程并不是不可以,只是会显得很臃肿),函数式编程的一个重要优点就是这样的程序天然地适合并行运行,这对Java语言在多核时代继续保持主流语言的地位有很大帮助。另外,在并行计算中必须提及的还有OpenJDK的子项且Sumatra亏目前显卡的算术运
算能力-并行能力已经远远超过了CPU,在图形领域以外发掘显卡的潜力是近几年计算机发展的方向之一,例如FC语言的CUDA。Sumatra项目就是为Java提供使用GPU (GraphicsProcessing Units)-和APU (Accelerated Processing Units)运算能力的重具,以后它将会直接提供Java语言层面的API,或者为Lambda和其他JVM语言提供底层的并行运算支持。,在JDK外围,也出现了专为满足并行计算需求的计算框架,如Apache的Hadoop Map/Reduce,这是一个简单易懂的并行框架,能够运行在由上千个商用机器组成的大型集群士,并且能以- -种可靠的容错方式并行处理TB级别的数据集。另外,还出现了诸如Scala、Clojure及Erlang等天生就具备并行计算能力的语言。
1.5.4 进一步丰富语法
Java 5曾经对Java语法进行了一次护充,这次扩充加人了自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环等语法,使得Java语言的精确性和易用性有了很大的进步。在Java7 (由于进度压力,许多改进已推迟至Java8)中,对Java语法进行了另-次大规模的扩充。Sun (已被Oracle收购)专门为改进Java语法在OpenJDK中建立了Coin子项目9来统一处理对Java语法的细节修改,如二进制数的原生支持、在switch语句中支持字符串、“<>”操作符、异常处理的改进、简化变长参数方法调用、面向资源的try-catch-finally语句等都是在Coin项目之中提交的内容。除了Coin项目之外,在JSR-335 (Lambda Expressions for the Java TM ProgrammingLanguage)中定义的Lambda表达式P也将对Java的语法和语言习惯产生很大的影响,面向函数方式的编程可能会成为主流。
1.5.5 64位虚拟机
在几年之前,主流的CPU就开始支持64位架构了。Java虚拟机也在很早之前就推出了支持64位系统的版本。但Java程序运行在64位虚拟机上需要付出比较大的额外代价:首先是内存问题,由于指针膨胀和各种数据类型对齐补白的原因,运行于64位系统上的Java应用需要消耗更多的内存,通常要比32位系统额外增加10% ~ 30%的内存消耗;其次,多个机构的测试结果显示,64位虚拟机的运行速度在各个测试项中几乎全面落后于32位虚拟机,两者大约有15%左右的性能差距。但是在JavaEE方面,企业级应用经常需要使用超过4GB的内存,对于64位虚拟机的需求是非常迫切的,但由于.上述原因,许多企业应用都仍然选择使用虚拟集群等方式继续在32位虚拟机中进行部署。Sun也注意到了这些问题,并做出了--些改善,在JDK1.6Update14之后,提供了普通对象指针压缩功能(-XX:+ UseCompressedOops,这个参数不建议显式设置,建议维持默认由虚拟机的Ergonomics机制自动开启),在执行代码时,动态植入压缩指令以节省内存消耗,但是开启压缩指针会增加执行代码数量,因为所有在Java堆里的、指向Java堆内对象的指针都会被压缩,这些指针的访问就需要更多的代码才可以实现,而且并不只是读写字段才受影响,在实例方法调用、子类型检查等操作中也受影响,因为对象实例指向对象类型的引用也被压缩了。随着硬件的进一-步发展,计算机终究会完全过渡到64位的时代,这是-一件毫无疑问的事情,主流的虛拟机应用也终究会从32位发展至64位,而虚拟机对64位的支持也将会进--步完善。
更多推荐
所有评论(0)