JVM与Java体系结构(一)
Java及JVM简介
Java生态圈
Java是目前应用最为广泛的软件开发平台之一,随着Java以及Java社区的不断壮大,Java也早已不再是简简单单的一门计算机语言了。它更是一个平台、一种文化、一个社区。
- 作为一个平台,Java虚拟机扮演者举足轻重的作用。Groovy、Scala、JRuby、Kotlin等都是Java平台的一部分。
- 作为一种文化,Java已经成为了开源的代名词。有许多第三方开源软件和框架。例如Tomcat、Mybatis、Spring等。就连JDK和JVM自身也有不少开源实现,如OpenJDK、Harmony。
- 作为一个社区,Java拥有全世界最多的技术拥护者和开源社区支持,有数不清的论坛和资料。从桌面应用软件、嵌入式开发到企业级应用、后台服务器、中间件,都可以看到Java的身影。其应用形式之复杂、参与人数之多也令人咋舌。
JVM:跨语言的平台
- 随着Java7的正式发布,Java虚拟机的设计者们通过JSR-292规范基本实现在Java虚拟机上运行非Java语言编写的程序。
- Java虚拟机根本不关心运行在其内部的程序到底是使用何种语言编写的,它只关心字节码文件。也就是说Java虚拟机具有语言无关性,并不会单纯的与Java语言“终身绑定”,只要其它语言的编译结果满足包含虚拟机的内部指令集、符号以及其它辅助信息,它就是一个有效的字节码文件,就能够被虚拟机识别并装载运行。
Java发展的重大事件
- 1990年,在Sun公司中,由Patrick Naughton、MikeSheridan及James Gosling领导的Green Team开发出的新的程序语言,命名为Oak,后期命名为Java。
- 1995年,Sun公司正式发布Java和HotSpot产品,Java首次公开亮相。
- 1996年1月23日MicroSystems发布了JDK1.0。
- 1998年,JDK1.2版本发布。同时,Sun发布了JSP/Servlet、EJB规范,以及将Java分为了J2EE、J2SE、J2EE。这表明了Java开始向企业、桌面应用和移动设备应用3大领域进军。
- 2000年,JDK1.3发布,Java HotSpot Virtual Machine正式发布,成为Java的默认虚拟机。
- 2002年,JDK1.4发布,古老的Classic虚拟机退出历史舞台。
- 2003年底,Java平台的Scala正式发布,同年Groovy也加入了Java阵营。
- 2004年,JDK1.5发布。同时JDK1.5改名为Java SE5.0。
- 2006年,JDK6发布。同年Java开源建立了Open JDK。顺利成章,HotSpot虚拟机也成为了Open JDK中的默认虚拟机。
- 2007年,Java平台迎来了新的伙伴Clojure。
- 2008年,Oracle收购了BEA,得到了JRockit虚拟机。
- 2009年,Twitter宣布把后台大部分程序从Ruby迁移到Scala,这是Java平台的又一次大规模应用。
- 2010年,Oracle收购了Sun,获得Java商标和最具有价值的HotSpot虚拟机。此时,Oracle拥有市场占有率的两款的虚拟机HotSpot和JRockit,并计划在未来对它们进行整合:HotRockit。
- 2011年,JDK7发布。在JDK1.7u4中,正式启用了新的垃圾回收器G1。
- 2017年,JDK9发布.将G1设置为默认GC,替代CMS。
- 2018年,Android的Java侵权案判决,Google赔偿了Oracle共计88亿美元。
- 同年,Oracle宣布Java EE成为历史名词,JDBC、JMS、Servlet赠与Eclipse基金会。
- 同年,JDK11发布,LTS版本的JDK,发布革命性的ZGC,调整JDK的授权许可。
- 2019年,JDK12发布,加入RedHat领导开发的Shenandoah GC。
虚拟机与Java虚拟机
所谓的虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟机指令。大体上可以分为系统虚拟机1和程序虚拟机2。无论是系统虚拟机还是程序虚拟机,在上面的运行的软件都被限制于虚拟机提供的资源中。
- Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,但是很重要的一点在于:其运行的Java字节码也就是我们常说的.class文件并不一定是由Java语言编译而成。JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回收器,以及可靠的即时编译器。可以说Java技术的核心就是Java虚拟机,因为程序所有的Java程序都运行在Java虚拟机内部。
- Java虚拟机就是二进制字节码的运行环境,负责装载字节码到内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,《Java虚拟机规范》中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放到哪里。其特点在于:一次编译,处处运行;自动内存管理;自动垃圾回收功能。