background image

 

框架所需的元信息,这种方法在 Java 

 

派生的 C# 语言中已广泛使用。遗憾的

 

是,对于在用户级利用这一灵活性还没有提供任何挂钩。

字节码和堆栈

   

构成类文件可执行部分的字节码实际上是针对特定类型的计算机 ― JVM ― 

 

的机器码。它被称为 虚拟机,因为它被设计成用软件来实现,而不是用硬件来

 

实现。每个用于运行 Java 

 

平台应用程序的 JVM 都是围绕该机器的实现而被构

 

建的。

这个虚拟机实际上相当简单。它使用堆栈体系结构,这意味着在使用指令操作
数之前要先将它们装入内部堆栈。指令集包含所有的常规算术和逻辑运算,以
及条件转移和无条件转移、装入/存储、调用/返回、堆栈操作和几种特殊类型
的指令。有些指令包含立即操作数值,它们被直接编码到指令中。其它指令直
接引用常量池中的值。

尽管虚拟机很简单,但实现却并非如此。早期的(第一代)JVM 基本上是虚拟

 

机字节码的解释器。这些虚拟机实际上 的确相对简单,但存在严重的性能问题 

 

― 解释代码的时间总是会比执行本机代码的时间长。为了减少这些性能问题,

 

第二代 JVM 

 

添加了 即时(just-in-time,JIT

 

)转换。在第一次执行 Java 字节

码之前,JIT 技术将它编译成本机代码,从而对于重复执行提供了更好的性能。

 

当代 JVM 的性能甚至还要好得多,因为使用了适应性技术来监控程序的执行

 

并有选择地优化频繁使用的代码。

装入类

 

诸如 C   

和 C++ 这些编译成本机代码的语言通常在编译完源代码之后需要链

接这个步骤。这一链接过程将来自独立编译好的各个源文件的代码和共享库代
码合并起来,从而形成了一个可执行程序。Java 

 

语言就不同。使用 Java 语言,

 

由编译器生成的类在被装入到 JVM 

 

之前通常保持原状。即使从类文件构建 JAR 

   

文件也不会改变这一点 ― JAR 只是类文件的容器。

 

链接类不是一个独立步骤,它是在 JVM 将这些类装入到内存时所执行作业的

 

一部分。在最初装入类时这一步会增加一些开销,但也为 Java 应用程序提供
了高度灵活性。例如,在编写应用程序以使用接口时,可以到运行时才指定其

 

实际实现。这个用于组装应用程序的 后联编

 

方法广泛用于 Java 平台,servlet 

 

就是一个常见示例。