java编译执行与jvm介绍

来源:互联网 发布:centos nc命令 编辑:程序博客网 时间:2024/06/16 18:45

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

 
原创粉丝点击