1、JVM跨语言的平台

 

 

  随着java7的正式发布,java虚拟机的设计者们通过JSR-292规范基本实现在java虚拟机平台上运行非java语言编写的程序。

 

 

  java虚拟机根本不关心运行在其内部的程序到底是使用何种语言编写的,它只关心“字节码”文件。也就是说java虚拟机拥有语言无关性,并不会单纯地与java语言“终身绑定”。

 

 

  只要其他编程语言的编译结果满足并包含java虚拟机的内部指令集,符号表以及其他的辅助信息,它就是一个有效的字节码文件,就能够被虚拟机所识别并转载运行。

 

1.1 java虚拟机

  虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。

  Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

  简单来说JVM是用来解析和运行Java程序的。

  Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。

  而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。

  Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

  Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够**“一次编译,到处运行”**的原因。

1.2 字节码

  我们平时说的java字节码,指的是用java语言编译成的字节码。准确的说任何能在jvm平台上执行的字节码格式都是一样的。所以应该统称为:jvm字节码

  不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的jvm上运行

  java虚拟机与java语言并没有必然的关系,它只与特定的二进制文件格式—Class文件格式所关联,Class文件中包含了java虚拟机指令集(或者称为字节码)和符号表,还有一些辅助信息。

1.3 虚拟机

  所谓的虚拟机,就是一台虚拟的计算机,它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机

  • 大名鼎鼎的Visual Box,VMware就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。
  • 程序虚拟机的典型代表就是java虚拟机,它专门为执行单个计算机程序而设计,在java虚拟机中执行的指令我们称为java字节码指令。

  无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。

1.4 JVM的位置

  

 

 

             JVM是运行在操作系统之上的,它与硬件没有直接的交互。

      

1.5 JVM的整体结构

  HotSpot  VM是目前市面上高性能虚拟机的代表作之一。

  它采用解释器与即时编译器并存的架构。

  

1.6 Java代码的执行流程

 

 

 

1.7 JVM的架构模型

  java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构

   这两种架构之间的区别:

    基于栈式架构的特点:

            设计和实现更简单,适用于资源受限的系统。

      避开了寄存器的分配难题,使用零地址指令方式分配。(一直使用的是栈顶的元素进行操作,所以始终是零地址分配

      指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器容易实现。

      不需要硬件支持,可移植性更好,更好实现跨平台。

    基于寄存器架构的特点:
      典型的应用是x86的二进制指令集,比如传统的PC以及Android的Davlik虚拟机。

      指令集架构则完全依赖硬件,可移植性差。

      性能优秀和执行更高效。

      花费更小的指令去完成一项操作。

      在大部分的情况下,基于寄存器架构的指令集往往都以一地址指令,二地址指令和三地址指令为主,而基于栈式架构的指令集确实以零地址指令位置。

 

 

 

  总结:

    由于跨平台性的设计,java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。

    优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。

1.8 JVM的生命周期

  虚拟机的启动

    java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类来完成的,这个类是由虚拟机的集体实现指定的。

  虚拟机的执行

    一个运行中的java虚拟机有着一个清晰的任务:执行java程序

    程序开始执行时它才运行,程序结束时它就停止。

    执行一个所谓的java程序的时候,真真正正在执行的是一个叫做java虚拟机的进程。

  虚拟机的退出

    程序正常执行结束。

    程序在执行过程中遇到了异常或错误而异常终止。

    由于操作系统出现错误而导致java虚拟机进程终止。

    某线程调用Runtime类或System的exit方法,或Runtime类的halt方法,并且java安全管理器也允许这次exit或halt操作。

    除此之外,JNI规范描述了用JNI Invocation API来加载或卸载java虚拟机时,java虚拟机的退出情况。

1.9 JVM发展历程

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    

 

版权声明:本文为rcdeng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/rcdeng/p/14955289.html