知识大全 JAVA文件编译执行与虚拟机(JVM)介绍

Posted 字节

篇首语:学如逆水行舟,不进则退。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 JAVA文件编译执行与虚拟机(JVM)介绍相关的知识,希望对你有一定的参考价值。

JAVA文件编译执行与虚拟机(JVM)介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  Java虚拟机(JVM)是可运行Java代码的假想计算机 只要根据JVM规格描述将解释器移植到特定的计算机上 就能保证经过编译的任何Java代码能够在该系统上运行 本文首先简要介绍从Java文件的编译到最终执行的过程 随后对JVM规格描述作一说明      一 Java源文件的编译 下载 解释和执行  Java应用程序的开发周期包括编译 下载 解释和执行几个部分 Java编译程序将Java源程序翻译为JVM可执行代码?字节码 这一编译过程同C/C++的编译有些不同 当C编译器编译生成一个对象的代码时 该代码是为在某一特定硬件平台运行而产生的 因此 在编译过程中 编译程序通过查表将所有对符号的引用转换为特定的内存偏移量 以保证程序运行 Java编译器却不将对变量和方法的引用编译为数值引用 也不确定程序执行过程中的内存布局 而是将这些符号引用信息保留在字节码中 由解释器在运行过程中创立内存布局 然后再通过查表来确定一个方法所在的地址 这样就有效的保证了Java的可移植性和安全性     运行JVM字节码的工作是由解释器来完成的 解释执行过程分三部进行 代码的装入 代码的校验和代码的执行 装入代码的工作由 类装载器 (class loader)完成 类装载器负责装入运行一个程序需要的所有代码 这也包括程序代码中的类所继承的类和被其调用的类 当类装载器装入一个类时 该类被放在自己的名字空间中 除了通过符号引用自己名字空间以外的类 类之间没有其他办法可以影响其他类 在本台计算机上的所有类都在同一地址空间内 而所有从外部引进的类 都有一个自己独立的名字空间 这使得本地类通过共享相同的名字空间获得较高的运行效率 同时又保证它们与从外部引进的类不会相互影响 当装入了运行程序需要的所有类后 解释器便可确定整个可执行程序的内存布局 解释器为符号引用同特定的地址空间建立对应关系及查询表 通过在这一阶段确定代码的内存布局 Java很好地解决了由超类改变而使子类崩溃的问题 同时也防止了代码对地址的非法访问     随后 被装入的代码由字节码校验器进行检查 校验器可发现操作数栈溢出 非法数据类型转化等多种错误 通过校验后 代码便开始执行了     Java字节码的执行有两种方式    即时编译方式 解释器先将字节码编译成机器码 然后再执行该机器码    解释执行方式 解释器通过每次解释并执行一小段代码来完成Java字节码程 序的所有操作   通常采用的是第二种方法 由于JVM规格描述具有足够的灵活性 这使得将字节码翻译为机器代码的工作    具有较高的效率 对于那些对运行速度要求较高的应用程序 解释器可将Java字节码即时编译为机器码 从而很好地保证了Java代码的可移植性和高性能      二 JVM规格描述  JVM的设计目标是提供一个基于抽象规格描述的计算机模型 为解释程序开发人员提很好的灵活性 同时也确保Java代码可在符合该规范的任何系统上运行 JVM对其实现的某些方面给出了具体的定义 特别是对Java可执行代码 即字节码(Bytecode)的格式给出了明确的规格 这一规格包括操作码和操作数的语法和数值 标识符的数值表示方式 以及Java类文件中的Java对象 常量缓冲池在JVM的存储映象 这些定义为JVM解释器开发人员提供了所需的信息和开发环境 Java的设计者希望给开发人员以随心所欲使用Java的自由     JVM定义了控制Java代码解释执行和具体实现的五种规格 它们是   JVM指令系统  JVM寄存器  JVM栈结构  JVM碎片回收堆  JVM存储区     JVM指令系统    JVM指令系统同其他计算机的指令系统极其相似 Java指令也是由 操作码和操作数两部分组成 操作码为 位二进制数 操作数进紧随在操作码的后面 其长度根据需要而不同 操作码用于指定一条指令操作的性质(在这里我们采用汇编符号的形式进行说明) 如iload表示从存储器中装入一个整数 anewarray表示为一个新数组分配空间 iand表示两个整数的 与 ret用于流程控制 表示从对某一方法的调用中返回 当长度大于 位时 操作数被分为两个以上字节存放 JVM采用了 big endian 的编码方式来处理这种情况 即高位bits存放在低字节中 这同 Motorola及其他的RISC CPU采用的编码方式是一致的 而与Intel采用的 little endian 的编码方式即低位bits存放在低位字节的方法不同     Java指令系统是以Java语言的实现为目的设计的 其中包含了用于调用方法和监视多先程系统的指令 Java的 位操作码的长度使得JVM最多有 种指令 目前已使用了 多种操作码      JVM指令系统    所有的CPU均包含用于保存系统状态和处理器所需信息的寄存器组 如果虚拟机定义较多的寄存器 便可以从中得到更多的信息而不必对栈或内存进行访问 这有利于提高运行速度 然而 如果虚拟机中的寄存器比实际CPU的寄存器多 在实现虚拟机时就会占用处理器大量的时间来用常规存储器模拟寄存器 这反而会降低虚拟机的效率 针对这种情况 JVM只设置了 个最为常用的寄存器 它们是   pc程序计数器  optop操作数栈顶指针  frame当前执行环境指针  vars指向当前执行环境中第一个局部变量的指针  所有寄存器均为 位 pc用于记录程序的执行 optop frame和vars用于记录指向Java栈区的指针      JVM栈结构    作为基于栈结构的计算机 Java栈是JVM存储信息的主要方法 当JVM得到一个Java字节码应用程序后 便为该代码中一个类的每一个方法创建一个栈框架 以保存该方法的状态信息 每个栈框架包括以下三类信息   局部变量  执行环境  操作数栈    局部变量用于存储一个类的方法中所用到的局部变量 vars寄存器指向该变量表中的第一个局部变量   执行环境用于保存解释器对Java字节码进行解释过程中所需的信息 它们是 上次调用的方法 局部变量指针和操作数栈的栈顶和栈底指针 执行环境是一个执行一个方法的控制中心 例如 如果解释器要执行iadd(整数加法) 首先要从frame寄存器中找到当前执行环境 而后便从执行环境中找到操作数栈 从栈顶弹出两个整数进行加法运算 最后将结果压入栈顶   操作数栈用于存储运算所需操作数及运算的结果      JVM碎片回收堆    Java类的实例所需的存储空间是在堆上分配的 解释器具体承担为类实例分配空间的工作 解释器在为一个实例分配完存储空间后 便开始记录对该实例所占用的内存区域的使用 一旦对象使用完毕 便将其回收到堆中   在Java语言中 除了new语句外没有其他方法为一对象申请和释放内存 对内存进行释放和回收的工作是由Java运行系统承担的 这允许Java运行系统的设计者自己决定碎片回收的方法 在SUN公司开发的Java解释器和Hot Java环境中 碎片回收用后台线程的方式来执行 这不但为运行系统提供了良好的性能 而且使程序设计人员摆脱了自己控制内存使用的风险      JVM存储区    JVM有两类存储区 常量缓冲池和方法区 常量缓冲池用于存储类名称 方法和字段名称以及串常量 方法区则用于存储Java方法的字节码 对于这两种存储区域具体实现方式在JVM规格中没有明确规定 这使得Java应用程序的存储布局必须在运行过程中确定 依赖于具体平台的实现方式     JVM是为Java字节码定义的一种独立于具体平台的规格描述 是Java平台独立性的基础 目前的JVM还存在一些限制和不足 有待于进一步的完善 但无论如何 JVM的思想是成功的     对比分析 如果把Java原程序想象成我们的C++原程序 Java原程序编译后生成的字节码就相当于C++原程序编译后的 x 的机器码(二进制程序文件) JVM虚拟机相当于 x 计算机系统 Java解释器相当于 x CPU 在 x CPU上运行的是机器码 在Java解释器上运行的是Java字节码     Java解释器相当于运行Java字节码的 CPU 但该 CPU 不是通过硬件实现的 而是用软件实现的 Java解释器实际上就是特定的平台下的一个应用程序 只要实现了特定平台下的解释器程序 Java字节码就能通过解释器程序在该平台下运行 这是Java跨平台的根本 当前 并不是在所有的平台下都有相应Java解释器程序 这也是Java并不能在所有的平台下都能运行的原因 它只能在已实现了Java解释器程序的平台下运行 cha138/Article/program/Java/hx/201311/26222

相关参考

知识大全 关于设置Java虚拟机(JVM)的内存问题

关于设置Java虚拟机(JVM)的内存问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  最近做

知识大全 64位计算中的Java虚拟机(JVM)性能测试

64位计算中的Java虚拟机(JVM)性能测试  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  随

知识大全 提高代码质量及字节码防止内存错误

  大多Java程序员知道他们的程序通常不会被编译为本机代码而是被编译为由java虚拟机(JVM)执行的字节码格式然而很少有java程序员曾经看过字节码因为他们的工具不鼓励他们去看大多Java调试工具

知识大全 java虚拟机管理大内存

 众所周知jvm的内存是受限的一为机器的体系架构二为操作系统本身xxSPARC的内存映射是不同而各操作系统的内存管理机制也有区别以下是来自;Heap设定与垃圾回收JavaHeap分为个区Yo

知识大全 深究Java虚拟机

深究Java虚拟机  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!JVM:JavaVirtualMa

知识大全 JAVA虚拟机实例学习笔记一

JAVA虚拟机实例学习笔记一  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  编译顺序      

知识大全 怎样制作可执行的java程序

  常常在网上看到有人询问如何把java程序编译成exe文件通常回答只有两种一种是制作一个可执行的JAR文件包然后就可以像chm文档一样双击运行了而另一种是使用JET来进行  编译但是JET是要用钱买

知识大全 正确认识java JVM与c/c++的执行效率

正确认识javaJVM与c/c++的执行效率  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  认为

知识大全 win7装linux虚拟机如何与主机共享文件夹

win7装linux虚拟机如何与主机共享文件夹这个要分两大步来做:以VMwareWorkstation为例(其他虚拟软件类似):1.在虚拟机设置里面设置主机文件夹共享。首先确认你的虚拟机安装了Vmwa

知识大全 java源代码分析----jvm.dll装载过程

  简述    众所周知javaexe是javaclass文件的执行程序但实际上javaexe程序只是  一个执行的外壳它会装载jvmdll(windows下以下皆以windows平台为例  linu