深入理解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架构。

    

四、大尾端和小尾端

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

  如图所示:

  

时间: 2024-12-04 21:45:04

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

Java-与平台无关性

Java与平台无关性:本文取自GitHub 相信对于很多Java开发来说,在刚刚接触Java语言的时候,就听说过Java是一门跨平台的语言,Java是平台无关性的,这也是Java语言可以迅速崛起并风光无限的一个重要原因.那么,到底什么是平台无关性?Java又是如何实现平台无关性的呢?本文就来简单介绍一下. 什么是平台无关性 平台无关性就是一种语言在计算机上的运行不受平台的约束,一次编译,到处执行(Write Once ,Run Anywhere). 也就是说,用Java创建的可执行二进制程序,能

平台无关性

1.java如何实现的平台无关性 首先,Java提供了jdk,供开发人员进行java开发,而.java文件本身并不具备平台无关性的特性.java文件编译后,生成了class文件. 而sun公司提供了不同平台的jre(里面的bin目录就可以看做是jvm),windows的.linux的.unix的,编译后的class文件就在各个平台下的jvm上运行,将class文件解释成电脑能够识别的机器代码,从而实现的平台无关性 原文地址:https://www.cnblogs.com/xiaobo520/p/

深入理解java虚拟机(3)---类的结构

计算机在开始的时候,只认识0和1,所以汇编语言是和机器结构或者说CPU绑定的.ARM体系结构就是这样一种体现,指令集的概念. 随着高级语言的出现,从字编码发展到了字节编码,计算机的先驱希望能够让语言能够脱离语言的环境,从而程序员只要开发代码,而无需适配设备. java语言就是这样被创建了.java通过虚拟机这样一个中间件,由它来沟通语言和操作系统间的联系,从而使java可以跨平台使用.虚拟机的设计不 仅仅是只供java使用,而是对于其他语言,在未来,也可以提供平台无关性的体验.所以虚拟机处理的不

理解Java虚拟机体系结构

1 概述 众所周知,Java支持平台无关性.安全性和网络移动性.而Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统一的编程接口,而不管下层操作系统是什么.正是得益于Java虚拟机,它号称的"一次编译,到处运行"才能有所保障. 1.1 Java程序执行流程 Java程序的执行依赖于编译环境和运行环境.源码代码转变成可执行的机器代码,由下面的流程完成: Java技术的核心就是Java虚拟机,因为所有的Java程序都在虚拟机上运行.Java程序的运行需要Java

深入理解java虚拟机之类文件结构

我们都知道,java是一种平台无关的语言.java代码通过java编译器(如javac等),将.java文件编译成字节码,也就是.class文件.字节码是运行在jvm虚拟机之上的.而不同的平台则 有不同的虚拟机映射规则.因此,我们从虚拟机上面一层来看,java是平台无关的.write once ,写的java程序,只要在装了jre的电脑,或者任何设备中,都可以运行,也就是run anywhere. 下面主要介绍一下从深入理解Java虚拟机中学习到的类文件结构,也就是class文件规范. clas

理解Java虚拟机体系结构(转)

1 概述 众所周知,Java支持平台无关性.安全性和网络移动性.而Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统一的编程接口,而不管下层操作系统是什么.正是得益于Java虚拟机,它号称的“一次编译,到处运行”才能有所保障. 1.1 Java程序执行流程 Java程序的执行依赖于编译环境和运行环境.源码代码转变成可执行的机器代码,由下面的流程完成: Java技术的核心就是Java虚拟机,因为所有的Java程序都在虚拟机上运行.Java程序的运行需要Java虚拟机.J

《深入理解Java虚拟机》

Java运行详解 一.从机器语言到高级语言 计算机只认识0.1,对应于电路中低电平和高电平.因此,早期程序员使用特定的0.1串操控计算机,从而达到想要的目标效果.这些0.1串就称作指令,也叫机器码(比如0000代加载,000代表寄存器A,000000000000 代表地址为0的存储器,所以0000,0000, 000000000000 代表 LOAD A, 0-把存储器0中的值加载到寄存器A),指令集合即为机器语言.机器语言对计算机友好,但对人类来说直观性就很差了.此外,因为构成不同的计算机处理

【深入理解JAVA虚拟机】第三部分.虚拟机执行子系统.1.类文件结构

无关性 无关性的体现有两个方面: 1.平台无关性:可在不同的操作系统和机器指令集上执行,可在不同厂商的虚拟机平台上执行. 2.语言无关性:用不同编程语言写出的代码编译生成的文件都可以运行. 实现思想: 面向接口,定义虚拟机和编译器之间的接口规范.也就是编译后文件的存储格式——字节码(ByteCode). 任意一种编程语言,只要生成符合存储格式规范的Class文件,就可以被任意虚拟机执行. Class文件结构 Class文件结构是在<Java虚拟机规范>中定义的. Class文件的存储结构类似于

《深入理解Java虚拟机》:类加载的过程

<深入理解Java虚拟机>:类加载的过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段.其中类加载的过程包括了加载.验证.准备.解析.初始化五个阶段. 下面详细讲述类加载过程中每个阶段所做的工作. 加载 加载时类加载过程的第一个阶段,在加载阶段,虚拟机需要完成以下三件事情: 1.通过一个类的全限定名来获取其定义的二进制字节流. 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构. 3.在Java堆中生成一