刚上大学时,学校里教的程序设计语言就是Java,这也是我在编程世界中的第一母语。当你还没有学过任何编程知识的时候,听到Java一词时,感觉它好高端,同时又是遥不可及。在其他同学那,从学长们的口中了解到的,更是它的恐怖,学起来很难,挂的人很多,诸如此类。几年的学习后,庆幸自己能够将Java成为自己的编程利器。从开始的课程设计,到Android逐渐流行后,手机App开发,再到后来的Java Web开发,接触到了了不起的Spring框架,甚至目前许多大数据开源项目都是用Java编写的。可以说,在各个地方Java总能大展手脚。这里,我不去评判不同程序设计语言的好坏,我只是想慢慢揭开我所热爱的编程语言那神秘的面纱,去了解它背后的原理。

JVM

跨平台

Java程序语言设计的第一堂课,老师很引以为傲的一句话就是:『编写一次,到处运行』。平台无关性,这也是Java这门语言设计的最吸引人的地方。要实现平台无关性,就得屏蔽不同操作系统的特性。当写好一个Java程序要在机器上运行时,如果没有Java虚拟机,那么程序是不可能运行起来的。当你去Oracle官网下载Java虚拟机时,可以看到针对不同操作系统的各种版本的JDK。这里的跨平台,就是通过Java虚拟机来实现的,我们编写的Java程序都是运行在Java虚拟机之上,而虚拟机则是运行在操作系统之上,并且为我们屏蔽了不同操作系统的特性。所以,当我们在开发Java程序时,无需针对不同操作系统来开发不同版本。

Java体系结构

Java体系结构包含以下四个独立但相关的技术:

  • Java程序设计语言

    开始学习Java时,学习的Java语法就属于这一部分。面向对象的设计思想,基本数据类型、类、接口等都是Java语言的特点。也是程序设计者必需要掌握的,只有根据Java程序设计语言的规范来编写程序,才能够保证Java平台能够正确的执行。

  • Java class文件格式

    在开发Java程序时,我们编写的是.java文件,这是不能被虚拟机执行的,还需要通过Java编译器编译成.class文件,也就是包含字节码的文件。虚拟机执行Java程序时,是通过加载class文件来执行其中的字节码。这里为什么会多一个编译操作呢?这里,我想主要是可以对源代码进行语法检查、语义分析,同时进行压缩,减少存储空间。还有一个比较重要的应该是Java虚拟机并不是局限于Java这一种程序设计语言,因为Java虚拟机加载的是.class文件,所以其他能够编译成.class文件的程序设计语言都可以在Java虚拟机上运行,例如:Groovy、Scala等。

  • Java API

    Java API是Java平台提供的应用编程接口,Java API与特定的系统平台相关,通过Java API调用本地方法来访问主机资源。比如,进行磁盘I/O、网络传输、多线程编程等。Java API能够保证资源的安全获取,通过访问控制器来访问资源。

  • Java虚拟机

    Java虚拟机是一种抽象化的计算机,能够模拟计算机的功能,运行在实际的计算机之上,屏蔽了与具体操作系统平台相关的信息。这也是Java成为跨平台语言的一个重要原因。后面将详细介绍Java虚拟机的内部原理实现,这里只是简单介绍。我们编写的Java程序将由Java虚拟机来解释成对应的机器指令并执行。Java虚拟机有自己的内存管理模型,来为所运行的程序分配内存,同时也通过垃圾收集算法来释放不再使用的内存。

总结

前面,简单介绍了Java作为跨平台程序设计语言的特点,本系列文章的重点主要是放在Java虚拟机的远离实现上,Java体系结构中的其他技术并不会详细讲解。建议在学习Java虚拟机原理之前,先掌握基本的Java程序设计语言的基础知识,推荐Java编程思想一书。