Preface:两年前我第一次听说《深入java虚拟机》就非常感兴趣,然后买了本中文的,不过当时看起来很晦涩,没怎么翻。近期比较闲,就决定把它读下来,同时参考了中英文版本。因为我有读书作笔记的习惯,所以有了这个导读系列,希望对想了解一些java体系结构的朋友有一点点帮助。我觉得在行业里面呆几年之后,提起java,不能再只想到java语言,同时,如果遇到瓶颈问题,不再只从代码层次找解决方法。
java体系结构有4个组成部分, 每个部分都有相应的规范. 他们是java编程语言, java class文件格式, java API, java虚拟机.如图:
java虚拟机和java API
他们统称为java平台, java程序之所以可以在不同的电脑上运行,是因为java平台在不同的操作系统和硬件平台上都有实现.
java虚拟机是一个抽象的电脑, 它的规范定义了一些所有的虚拟机都必须实现的特性和功能, 但是也留给不同的实现者很多灵活性和可选择性. 这些灵活性使得java虚拟机在广泛的电脑平台和设备上被实现.
java虚拟机的主要工作就是装载class文件并执行其中的字节码; 虚拟机依靠class loader装载class, class loader可以从java API和用户程序中装载class. 如下图所示:
class loader只会装载哪些应用程序所需要的class. 字节码在执行引擎中被执行, 不同的java虚拟机的执行引擎的实现方式可能不一样. 最简单的执行引擎就是每次方法被调用时都解释一次字节码. 另一种执行引擎, 包含一个称之为just-in-time的编译器, 可以在方法第一次被调用时, 把方法翻译为本地机器代码, 这些机器代码会被缓存起来以被重用; 还有一种实现方式是执行引擎直接内嵌在芯片里面.
Class loader体系结构
class loader在安全和网络移动性上扮演重要的角色.你在上图中看到的是一个class loader, 事实上, class loader自成子系统, 而且虚拟机的类装载器具有一定的灵活性使得应用程序可以按定制化的方式加载类. java应用程序可使用3种class loader, 一种是原始的类加载器, 一种是拓展类加载器, 一种是系统类加载器.当然用户可以自定义类加载器.他们呈现自上至下的父子关系(是结构上的而不是继承关系中的父子关系),其中原始类加载器是JVM的一部分.
Java Class文件
class文件在平台无关性和网络移动性上扮演了重要的角色. 简单的说, class文件为在不同平台上实现的JVM提供了一致的字节序列, 这种方式有违于传统的语言方式,比如C, C++, 传统的方式中, 编写的程序将被编译, 连接成操作系统和硬件平台相关的二进制可执行文件, 一般来说, 这种可执行的二进制文件不能在其他操作系统和硬件平台上运行. 但java class文件可以运行在任何底层平台的JVM上. 另外, 传统的可执行的二进制文件有字节序列问题, 即little-endian or big-endian, 在java class中, 在任何平台下都是big-endian.
Java API
Java API是一系列的运行时库, 使你可以以一种标准的方式访问系统资源. 当你写java程序的时候, 你总是假设你所调用的系统API在任何JVM上都得到了实现, 事实上这是一种安全的假设, 因为java API在任何java平台上都是必须的,而且应该是一致的.
Java编程语言
不说了.
java体系结构的代价
第一个代价是java的执行速度肯定会比本地代码慢。但是先进的jvm可以侦测到最热点的代码并把它编译为本地代码,从全局看, 速度已经不是问题。第二个代价是它需要瞻前顾后的考虑兼容性问题。
资料请参考《inside java VM》:http://download.csdn.net/source/1483875