深入理解Java虚拟机之走近Java

时间:2022-12-27 17:40:00

概述

  Java不仅仅是一门语言,还是一个由一系列计算机软件和规范形成的技术体系,被广泛的应用于嵌入式系统、移动终端、企业服务器等各种场合。java能获得如此广泛的认可,除了它拥有一门结构严谨、面向对象的编程语言之外,还有许多不可忽视的优点:

  1. 它摆脱了硬件平台的束缚,实现“一次编写,到处运行”的理想;

  2. 它提供了一个相对安全的内存管理和访问机制,避免了绝大部分的内存泄露和指针越界问题;

  3. 它实现了热点代码检测和运行时编译优化,使得java应用能随着时间的增加而获得更高的性能...


Java技术体系

  JDK是用于支持java程序开发的最小环境,它包括java程序设计语言、java虚拟机、JavaAPI类库三部分。另外、java API类库中的Java SE API子集和Java虚拟机这两部分统称为JRE,JRE是支持程序运行的标准环境。从java技术所服务的领域来划分的话,java技术体系可以划分为4个平台,分别为:

  1. Java Card:支持一些java小程序(Applets)运行在小内存设备(如智能卡)上的平台。
  2. Java ME:支持Java程序运行在移动终端(手机、PDA)上的平台,Java API有所精简,并加入了针对移动终端的支持,这个版本以前称为J2ME。
  3. Java SE:支持面向桌面级应用(如Windows下的应用程序)的Java平台,提供了完整的Java核心API,这个版本以前称为J2SE。
  4. Java EE:支持使用多层架构的企业应用(如ERP、CRM应用)的Java平台,除了提供Java SE外,还对其做了大量扩充并提供了相关的部署支持,这个版本以前称为J2EE。

Java发展史

  java语言的前身Oak(橡树)与1991年4月发布。1995年5月Oak改名为Java,并在SunWorld大会上正式发布Java 1.0版本。Java语言第一次提出了“Write once,Run Anywhere”的口号。

 JDK 1.0版本的代表技术有:Java虚拟机、Applet、AWT等;

  JDK 1.1版本的代表技术有:JAR文件格式、JDBC、JavaBeans、RMI。Java语法也有了一定发展,如内部类和反射都是在这个时候出现的;

  JDK 1.2中出现的代表性技术非常多,如EJB、Java Plug-in、Java IDL、Swing等。在语言和API级别上,Java添加了strictfp关键字与现在Java编码中常用的一系列Collections集合类。并且在该版本中Java虚拟机第一次内置了JIT(Just in Time)编译器。

  JDK 1.3版本相对于JDK 1.2的改进主要表现在一些类库上(如数学运算和新的Timer API等),此外该版本还对Java 2D做了很多改进。

  JDK 1.4发布的新技术有:正则表达式、异常链、NIO、日志类、XML解析器和XSLT转换器;

  JDK 1.5在Java语法易用性做了非常大的改进,如自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环等语法特性。在虚拟机和API层面,该版本改进了Java内存模型、提供了java.util.concurrent并发包;

  JDK 1.6改进包括:提供动态语言支持、提供编译API和微型HTTP服务器API

  JDK 1.7主要改进包括:提供新的G1收集器、加强对非Java语言调用支持、升级类加载架构;

  JDK 1.8提供的新特性主要有Lambda表达式和JDK1.7中未能实现的一部分Coin。


Java虚拟机发展史

Sun公司虚拟机发展

  由于HotSpot虚拟机太过于有名,因此不少java程序员会潜意识得将它等同于Java虚拟机,事实上除HotSpot外,还有不少其他的虚拟机实现,下面我们就来回顾下Java虚拟机的发展史。

  1996年,Sun公司发布了JDK 1.0,这个JDK中所带的虚拟机就是Classic VM,这也是“世界上第一款商用虚拟机”。这款虚拟机只能使用纯解释器方式来执行代码,如果要使用JIT编译器,就必须外挂,但是外挂了JIT编译器,解释器便不在工作。由于解释器和编译器不能配合工作,这就意味着如果要使用编译器执行,编译器就不得不对每个方法、每行代码进行编译,而无论它们执行频率是否具有编译价值。因此这个阶段的虚拟机执行效率和传统的C/C++程序有很大差距。

  为了改变这种现状,Sun的虚拟机团队在JDK 1.2上发布了一款名为Exact VM的虚拟机。它的执行系统已经具备现代高性能虚拟机雏形:如两级即时编译器、编译器与解释器混合工作模式等。虽然Exact VM相对于Classic VM先进了许多。但很快它被更为优秀的HotSpot所取代。

  相信Java程序员对HotSpot并不陌生。它是Sun JDK和Open JDK中所带的虚拟机,也是目前使用最广的虚拟机。HotSpot有许多新技术,如它的名字HotSpot指的就是它的热点代码探测技术。该技术可以通过执行计数器找出最具有编译价值的代码,然后通知JIT编译器以方法为单位进行编译。

  2006年,Sun公司宣布最终会把Java开源,并在随后的一年,陆续将JDK的各个部分公开了源码,并再次基础上建立了OpenJDK 。

  除了这些大家所熟知的虚拟机外,Sun公司也发布过其他的Java虚拟机,如运用于移动系统的KVM,运用于Java Card的Squawk VM等虚拟机。这些虚拟机对不从事相关领域的开发者来说,或许不太会接触到。这里就不再多做介绍。

  除了Sun公司外,其他一些公司也发展了自己的虚拟机,如BEA公司的JRockit和IBM J9 VM。

Apache Harmony / GoogleAndroid Dalvik VM 虚拟机

  Apache Harmony是一个Apache软件基金会旗下的兼容于JDK1.5和JDK1.6的Java程序运行平台,它包含自己的虚拟机和Java库。但它没有通过TCK认证。如果一个公司要宣布自己的运行平台“兼容于Java语言”,那就必须要通过TCK认证。Apache公司曾要求Sun公司提供TCk使用授权,但一直遭到拒绝!因此严格来说Apache Harmony只能称作“虚拟机”,而非Java虚拟机。

  说道Harmony,就不得不提Android。Harmony中的许多代码被吸纳进了Android SDK中,对Android的发展起到了很大的推动作用。

  而​Dalvik VM是Android平台的核心组成部分之一。Dalvik VM并不是一个Java虚拟机,它没有遵循Java虚拟机规范,不能直接执行Java的Class文件,使用的是寄存器架构而不是JVM中常见的栈架构。


申明:以上内容来自《深入理解Java虚拟机》 周志明 著