Java平台

Java技术体系

从广义上讲,Clojure、JRuby、Groovy等运行于JVM上的语言及其相关的程序都属于Java技术体系中的一员。

从传统意义上来看,Sun官方所定义的Java技术体系包括以下几个组成部分:

  • Java程序设计语言

  • 各种硬件平台上的JVM

  • Class文件格式

  • Java API类库

  • 来自商业机构和开源社区的第三方Java类库

把Java程序设计语言、JVM、Java API类库这三个部分统称为JDK(Java Development Kit)。JDK是用于支持Java程序开发的最小环境。

把Java API类库中的Java SE API子集和JVM这两个部分统称为JRE(Java Runtime Environment)。JRE是支持Java程序运行的标准环境。

Java发展史

  • 1991年4月:Java语言的前身 —— Oak语言诞生。

  • 1995年5月23日:Oak语言改名为Java,并在SunWorld大会上正式发布Java 1.0版本,即Java语言诞生

  • 1996年1月23:JDK 1.0发布,其代表技术有:JVM(纯解释执行)、Applet、AWT等。

  • 1996年5月:Sun公司于美国旧金山举行了首届JavaOne大会。

  • 1997年2月19日:JDK 1.1发布,其代表技术有:JAR文件格式、JDBC、JavaBeans、RMI。Java语法也新增了内部类(Inner Class)、反射(Reflection)等。

  • 1998年12月4日:JDK 1.2发布,其代表技术有:内置JIT的JVM、EJB、Java Plugin、Java IDL、Swing等。同时,Java技术体系被拆分为三个方向,分别是面向桌面应用开发的J2SE(Java 2 Platform,Standard Edition)、面向企业级开发的J2EE(Java 2 Platform,Enterprise Edition)、面向移动终端开发的J2ME(Java 2 Platform,Micro Edition)。

  • 2000年5月8日:JDK 1.3发布,主要改进了一些类库,如数学运算、新的Timer API。

  • 2002年2月13日:JDK 1.4发布,添加了不少新的技术特性,如正则表达式、异常链、NIO、日志类、XML解析器和XSLT转换器等。

  • 2004年9月30日:JDK 1.5发布。它在Java语法易用性上做出重大的改进,如自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环(foreach)等。在虚拟机和API层面上,此版本改进了Java内存模型(Java Memory Model,JMM)和提供了java.util.concurrent并发包。

  • 2006年11月13日:Sun公司在GPL v2(GNU General Public License v2)协议下公开Java源码,并建立了OpenJDK组织独立管理这些源码。在JDK 1.7中,Sun JDK和OpenJDK除了代码文件头的版权注释之外,代码基本上完全一样。

  • 2006年12月11日:JDK 1.6发布。它将JDK 1.2时的J2SE、J2EE、J2ME改名为Java SE 6、Java EE 6、Java ME 6。它提供了动态语言支持、编译API和微型HTTP服务器API等。同时,它对JVM内部做了大量的改进,包括锁同步、垃圾收集、类加载等算法改进。

  • 2011年7月28日:JDK 1.7发布,主要改进有:提供新的G1收集器、加强对非Java语言的调用支持、升级类加载架构等。注意,JDK 7 Update6开始才完全支持Mac OS。

Java特性

Java本身是一种面向对象的语言,最显著的特性有两个方面:

  1. Java通过字节码和JVM这种跨平台的抽象,屏蔽了操作系统和硬件的细节,实现了“书写一次,到处运行”(Write once, run anywhere)。

  2. 垃圾收集(GC,Garbage Collection),Java通过垃圾收集器(Garbage Collector)回收分配内存,大部分情况下,程序员不需要自己操作内存的分配和回收。

Java的编译

首先,将Java源码文件编译成.class文件(注意,文件里面是字节码,而不是可以直接执行的机器码)。

在运行时,JVM会加载字节码,其内嵌的解释器会将字节码转换成最终的机器码来进行“解释执行”。

部分拥有JIT(Just-In-Time)编译器的JVM(比如常见的Oracle JDK中的Hotspot JVM),能够在运行时将热点代码编译成机器代码,对字节码进行“编译执行”。

还有一种叫做AOT(Ahead-of-Time Compilation)的新编译方式,可以在程序运行前,直接将字节码编译成机器代码,这样可避免JIT预热等各方面的开销。比如,Oracle JDK 9引入了实验性的AOT特性。

目前主流Java版本中,如Oracle JDK8,主要是采用解释和JIT编译混合的一种执行模式,其运作过程大体如下:

  1. 将Java源码文件编译成.class文件,即字节码。

  2. 程序运行时,JVM解释器对字节码进行解释执行。

  3. 在程序运行时收集性能监控信息,知晓“热点代码”。

  4. JVM的JIT编译器将热点代码编译成机器代码,进行编译执行。