首页 > 代码库 > 深入理解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虚拟机(一) 理解平台无关性