首页 | 联系我们 | 叶凡网络官方QQ群:323842844
游客,欢迎您! 请登录 免费注册 忘记密码
您所在的位置:首页 > 新闻中心 > 行业新闻 > 正文

名扬互联:简单说说Java虚拟机的JVM介绍

作者:cocomyyz 来源: 日期:2014-2-20 10:45:02 人气:0 加入收藏 评论:0 标签:

Java字节码就能通过解释器程序在该平台下运行,这是Java跨平台的根本。当前,并不是所有的平台下都有相应Java解释器程序,这也是Java并不能在所有的平台下都能运行的原因,只能在已实现了Java解释器程序的平台下运行。Java解释器相当于运行Java字节码的CPU,但该“CPU不是通过硬件实现的而是用软件实现的Java解释器实际上就是特定的平台下的一个应用程序。只要实现了特定平台下的解释器程序。就能保证经过编译的任何Java代码能够在该系统上运行。本文首先简要介绍从Java文件的编译到最终执行的过程,JVMJava虚拟机)可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上。随后对JVM规格描述作一说明。

这也包括顺序代码中的类所继承的类和被其调用的类。当类装载器装入一个类时,运行JVM字节码的工作是由解释器来完成的解释执行过程分三部进行:代码的装入、代码的校验和代码的执行。装入代码的工作由"类装载器"classloader完成。类装载器负责装入运行一个程序需要的所有代码。该类被放在自己的名字空间中。除了通过符号引用自己名字空间以外的类,类之间没有其他方法可以影响其他类。

Java源文件的编译、下载、解释和执行:该代码是为在某一特定硬件平台运行而产生的因此,Java应用顺序的开发周期包括编译、下载、解释和执行几个部分。Java编译顺序将Java源顺序翻译为JVM可执行代码—字节码。这一编译过程同C/C++编译有些不同。当C编译器编译生成一个对象的代码时。编译过程中,编译顺序通过查表将所有对符号的引用转换为特定的内存偏移量,以保证顺序运行。Java编译器却不将对变量和方法的引用编译为数值引用,也不确定顺序执行过程中的内存布局,而是将这些符号引用信息保存在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在地址。这样就有效的保证了Java可移植性和安全性。

而所有从外部引进的类,本台计算机上的所有类都在同一地址空间内。都有一个自己独立的名字空间。这使得外地类通过共享相同的名字空间获得较高的运行效率,同时又保证它与从外部引进的类不会相互影响。当装入了运行顺序需要的所有类后,解释器便可确定整个可执行程序的内存布局。解释器为符号引用同特定的地址空间建立对应关系及查询表。通过在这一阶段确定代码的内存布局,Java很好地解决了由超类改变而使子类崩溃的问题,同时也防止了代码对地址的非法访问。被装入的代码由字节码校验器进行检查。校验器可发现操作数栈溢出,随后非法数据类型转化等多种错误。通过校验后,代码便开始执行了

JVM定义了控制Java代码解释执行和具体实现的五种规格。JVM指令系统,JVM寄存器,JVM栈结构,JVM碎片回收堆,JVM存储区。操作数进紧随在操作码的后面,JVM指令系统同其他计算机的指令系统极其相似。Java指令也是由 操作码和操作数两部分组成。操作码为8位二进制数。其长度根据需要而不同。操作码用于指定一条指令操作的性质(这里我采用汇编符号的形式进行说明)如iload表示从存储器中装入一个整数,anewarrai表示为一个新数组分配空间,iand表示两个整数的"与"ret用于流程控制,表示从对某一方法的调用中返回。操作数被分为两个以上字节存放。JVM采用了"bigendian"编码方式来处置这种情况,当长度大于8位时。即高位bit存放在低字节中。这同 Motorola及其他RISCCPU采用的编码方式是一致的而与Intel采用的"littlendian"编码方式即低位bit存放在低位字节的方法不同。目前已使用了160多种操作码。Java指令系统是以Java语言的实现为目的设计的其中包括了用于调用方法和监视多先程系统的指令。Java8位操作码的长度使得JVM最多有256种指令。

便可以从中得到更多的信息而不必对栈或内存进行访问,所有的CPU均包括用于保管系统状态和处置器所需信息的寄存器组。如果虚拟机定义较多的寄存器。这有利于提高运行速度。然而,如果虚拟机中的寄存器比实际CPU寄存器多,实现虚拟机时就会占用处置器大量的时间来用惯例存储器模拟寄存器,这反而会降低虚拟机的效率。针对这种情况,JVM只设置了4个最为常用的寄存器。pc顺序计数器、optop操作数栈顶指针、frame当前执行环境指针,fram和var用于记录指向Java栈区的指针。var指向当前执行环境中第一个局部变量的指针 所有寄存器均为32位。pc用于记录顺序的执行。

Java栈是JVM存储信息的主要方法。当JVM得到一个Java字节码应用顺序后,作为基于栈结构的计算机。便为该代码中一个类的每一个方法创建一个栈框架,以保管该方法的状态信息。每个栈框架包括以下三类信息:局部变量、执行环境、操作数栈,局部变量用于存储一个类的方法中所用到局部变量。var寄存器指向该变量表中的第一个局部变量。而后便从执行环境中找到操作数栈,执行环境用于保管解释器对Java字节码进行解释过程中所需的信息。上次调用的方法、局部变量指针和操作数栈的栈顶和栈底指针。执行环境是一个执行一个方法的控制中心。例如:如果解释器要执行iadd整数加法)首先要从frame寄存器中找到当前执行环境。从栈顶弹出两个整数进行加法运算,最后将结果压入栈顶。操作数栈用于存储运算所需操作数及运算的结果。

Java字节码的执行有两种方式:即时编译方式,解释器先将字节码编译成机器码;解释执行方式,解释器通过每次解释并执行一小段代码来完成Java字节码程 序的所有操作。这使得将字节码翻译为机器代码的工作通常采用的第二种方法。由于JVM规格描述具有足够的灵活性。解释器可将Java字节码即时编译为机器码,具有较高的效率。对于那些对运行速度要求较高的应用顺序。从而很好地保证了Java代码的可移植性和高性能。为解释顺序开发人员提很好的灵活性,JVM设计目标是提供一个基于笼统规格描述的计算机模型。同时也确保Java代码可在符合该规范的任何系统上运行。JVM对其实现的某些方面给出了具体的定义,特别是对Java可执行代码,即字节码(Bytecod格式给出了明确的规格。这一规格包括操作码和操作数的语法和数值、标识符的数值表示方式、以及Java类文件中的Java对象、常量缓冲池在JVM存储映象。这些定义为JVM解释器开发人员提供了所需的信息和开发环境。Java设计者希望给开发人员以随心所欲使用Java自由。

便开始记录对该实例所占用的内存区域的使用。一旦对象使用完毕,Java类的实例所需的存储空间是堆上分配的解释器具体承担为类实例分配空间的工作。解释器在为一个实例分配完存储空间后。便将其回收到堆中。除了new语句外没有其他方法为一对象申请和释放内存。对内存进行释放和回收的工作是由Java运行系统承当的这允许Java运行系统的设计者自己决定碎片回收的方法。SUN公司开发的Java解释器和HotJava环境中,Java语言中。碎片回收用后台线程的方式来执行。这不但为运行系统提供了良好的性能,而且使顺序设计人员解脱了自己控制内存使用的风险。

依赖于具体平台的实现方式。JVM有两类存储区:常量缓冲池和方法区。常量缓冲池用于存储类名称、方法和字段名称以及串常量。方法区则用于存储Java方法的字节码。对于这两种存储区域具体实现方式在JVM规格中没有明确规定。这使得Java应用顺序的存储布局必需在运行过程中确定。Java平台独立性的基础。目前的JVM还存在一些限制和不足,JVM为Java字节码定义的一种独立于具体平台的规格描述。有待于进一步的完善,但无论如何,JVM思想是胜利的,Java原顺序编译后生成的字节码就相当于C++原顺序编译后的80x86机器码(二进制程序文件)JVM虚拟机相当于80x86计算机系统,对比分析:如果把Java原顺序想象成我C++原程序。Java解释器相当于80x86CPU80x86CPU上运行的机器码,Java解释器上运行的Java字节码。


本文网址:http://www.mingyangnet.com/html/hangye/1890.html
读完这篇文章后,您心情如何?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
更多>>网友评论
发表评论
编辑推荐
  • 没有资料