首页 > 代码库 > 深入理解Java虚拟机(一) 理解平台无关性

深入理解Java虚拟机(一) 理解平台无关性

Write Once Run Anywhere,一次编写多处运行

一、Java的运行机制

  如下图所示,Java上层应用程序对平台不透明,采用通用的java编译器将java源程序编译成为与平台无关的字节码文件(class文件),而在运行时由java虚拟机(JVM)对字节码文件解释执行,即Java字节码具有平台无关性,在Java生态体系中的语言,例如Android、Scala等,只要能按照Java的规则编译字节码文件,就能被识别来运行。而多处运行的前提是需要有不同版本的java虚拟机,不同系统平台的java运行环境其java虚拟机是不一样的。class文件由JVM(Java虚拟机)中的classLoader(类加载器)加载,解释器将其翻译成特定平台环境的机器指令并执行。

    技术分享 

  下图是Java程序具体的运行过程:

    技术分享

 

  一般情况下,class文件中的字节码由Java解释器解释成机器能识别运行的命令,而即时编译器的作用是将运行中的“热点位置”,即频繁执行的命令编译成本地机器码,供后续再次执行时快速执行。

 

二、平台体系架构

1、冯·诺依曼体系

 技术分享

  如图,该体系的设备有以下特点:

  • 必须有一个存储器、一个控制器和一个运算器
  • 必须有输入和输出设备,用于人机通信
  • 只有一个存储器,指令和数据存储在相同的内存空间,但存储地址不同
  • 处理器利用相同的总线处理内存中的指令和数据,指令和数据具有相同的数据宽度,指令和数据无法同时存取

优点:

  • 将指令当做data,可以修改指令值,方便软件升级
  • data区和指令区共用memory,方便data区和指令区大小灵活调整
  • 提高memory利用效率
  • 总线和控制相对简单,成本低
  • 对外围设备要求相对较低,只需要一个memory

缺点:

  • 同一条总线分时复用,读取指令时不能操作data,不能走流水线
  • 前一条指令执行阶段进行后,下一条才能取址。(取址、译码、执行)

2、哈佛体系

技术分享

  如图,哈佛体系的设备有如下特点:

  • 使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存;
  • 使用独立的两条总线,分别作为CPU与每个存储器之间的专用通信路径,而这两条总线之间毫无关联;
  • 取指令和存取数据可同时进行,微处理器具有较高的执行效率;
  • 提供了较大的存储器带宽;
  • 适合于数字信号处理,大多数DSP都是哈佛结构.

优点:

  • 执行指令效率高,流水线模式;
  • 前一条指令译码的时候,第二条取指;
  • 第二条译码,第三条取指。

缺点:

  • 很难操作修改指令,软件不好升级;
  • 指令区和data区独立,这样Memory利用效率不高,如果程序频繁变动的话;
  • Bus多成本高,对外设要求高。

冯诺依曼是很适合作为PC这样的机型,哈佛结构比较适合任务单调但需要高速率执行的CPU。

 

 三、指令集分类

  指令集分为复杂指令集CISC、精简指令集RISC和显式并行指令集EPIC。

  技术分享

  技术分享

  通常我们讨论时拿CISC和RISC来讲解。

  精简指令集RISC的指令系统相对简单,硬件只执行有限且常用的指令,大多数复杂的指令则依赖于成熟的编译技术,由简单指令合成。目前一些高端计算机采用精简指令集架构,比如IBM的Power系列,HP的Alpha系列和PA-RISC系列,SUN的UltraSPARC系列。采用哈佛总线结构,单周期执行指令,可以实现高效的流水线操作,面向高级语言。

  复杂指令集CISC,程序各条指令按顺序串行执行,这样控制比较简单,但计算机各部分利用率较低,指令不等长、指令条数多,因此编程和设计处理器时都比较麻烦。但基于CISC设计的软件应用已非常普遍,所以微处理器一直都在走CISC的发展之路。CISC的服务器主要以英特尔架构的服务器为主,通常所说的x86平台就是CISC架构。

    技术分享

 

 四、大尾端和小尾端

  大尾端和小尾端就是我们通常所说的“大小端”问题,小尾端指的是数据的低位存储在低地址,高位存储在高地址,而大尾端指的是数据的低位存储在高地址,高位存储在低地址。

  如图所示:

  技术分享

 

深入理解Java虚拟机(一) 理解平台无关性