Java Virtual Machine 官方介绍
Java虚拟机规范官方文档
https://docs.oracle.com/javase/specs/index.html
其中以java8的为
https://docs.oracle.com/javase/specs/jvms/se8/html/index.html
看下官方的介绍的一节
The Java Virtual Machine Java虚拟机是Java平台的基石。是java实现硬件和操做系统的独立性(也就是无关性),生成极小体积的编译代码,以及保护用户免受恶意程序攻击的的关键技术组成部分。
Java虚拟机是一种抽象计算机器。像真正的计算机同样,它有一个指令集以及在运行时各类内存区域。 使用虚拟机实现编程语言是至关广泛的; 最著名的虚拟机多是 P-Code machine of UCSD Pascal.
Java虚拟机的第一个原型实现是在Sun Microsystems inc.完成的,它在手持设备上仿真实现了Java虚拟机指令集,该设备相似于如今的我的数字助理(PDA)。Oracle如今已经将许多java虚拟机实现应用于 移动设备 pc 服务器等领域,可是Java虚拟机不局限于任何特定的实现技术、主机硬件或主机操做系统。也不局限于特定的代码执行方式,虽然不强求使用解释器来执行程序,可是也能够经过将它的指令集编译成一个实际的CPU来实现。它也能够在微代码microcode实现,也能够直接在CPU中实现。
Java虚拟机对Java编程语言一无所知,只知道一种特定的二进制格式,class文件格式。一个class文件包含Java虚拟机指令集(或者称之为字节码bytecode)和符号表,以及其余辅助信息。
基于安全方面的考虑,Java虚拟机在class文件中施加了许多强制性的语法和结构化约束,凡是能用class文件正确表达出来的编程语言,均可以放在Java虚拟机里面执行。因为它是一个通用的、机器无关的执行平台,因此其余语言的实现者均可以考虑将Java虚拟机做为那些语言的交付媒介。
|
java的组成部分
- Java语言规范
- Java 应用程序编程接口 API
- Java class文件格式规范
- Java虚拟机
java语言规范
也就是java的语法句法词法结构组成,数据类型长度等,对于java语言自己的描述
好比主函数须要时public static void main(String[] args){ 为何使用public而不是common表示公用?这就是java语言规范的做用
java应用程序编程接口
Java应用程序API 也就是java设计者提供的基本的功能方法,好比访系统资源
API之主要目的是提供应用程序与开发人员以访问一组例程的能力,而又无需访问源码,或理解内部工做机制的细节。
提供API所定义的功能的软件称做此API的实现。API是一种接口,故而是一种抽象。
应用程序接口为:"电脑操做系统(Operating system)’或‘程序库’提供给应用程序调用使用的代码
其实全部的功能也都是依赖操做系统自己的,好比读取文件,获取文件的属性
若是一个操做系统,自己就没有网络通讯的功能,你是不可能在上面完成网络通讯程序的开发的
Java class文件格式规范
编译后被Java虚拟机执行的一种二进制文件格式
这是一种统一的明确的格式 通常以文件的形式存储
其实就是java虚拟机的"机器语言"
Java虚拟机
读取class文件,解析class文件并执行,实际运行java的机器
一种抽象化的计算机,经过在实际的计算机上仿真模拟各类计算机功能来实现的。
编写任何一个程序你都会用到这四个技术领域
无关与相关的辩证关系
JVM是平台相关的,不一样的平台有不一样的虚拟机
可是她在不一样的平台上提供统一一致的JVM虚拟指令集,对具体的平台进行抽象封装
无论运行在何种平台,他们提供一致性的操做与访问形式
从JVM自己的平台相关性,转变成为JAVA语言的平台无关性
class文件是源代码编译后的 平台无关的 二进制文件格式,
不依赖于特定的硬件与操做系统表示形式
是JVM能够识别执行的语言,至关于JVM的机器语言
也就是说,无论何种语言,若是一旦可以编译成为符合规范的class文件格式
就可以被JVM进行执行! 这就至关于实现了语言无关性
能够说,java设计者的野心很大, class文件 与JVM的结合,语言无关加上平台无关
java语言实现与运行原理
再回头看下java技术体系,能够很清晰的看得出来
java的语言实现与运行原理
Java语言规范 和 Java 应用程序编程接口 API 提供了使用Java语言解决问题的方式
Java class文件格式规范 和Java虚拟机 则约定了Java的运行原理
class文件是对源代码的编译,不只仅具备语言无关性的好处
源代码是以对人友好的方式,class文件是机器友好的,经过对原始文件进行特殊的处理与转换,可以提升运行的性能,将一部分工做前置
class文件既然是对于源代码的转换描述
天然是会涉及到java中的各类数据类型,方法调用,常量等等的描述与表示
JVM既然是解析class文件进行解析执行,天然是须要解析class文件,而且可以读取验证文件的格式以及语法格式,而后进行装载运行
因此说想要了解Java的运行原理
最基本的两个部分就是class文件的结构组成以及JVM的运行区域内存的管理
Java语法中全部的一切都要可以表示出来
好比数据类型 引用类型仍是基本类型 字段属性 方法 公有私有 静态 非静态 如何表示描述
以及必要的信息,好比当前对象的this等等
某种程度上来讲 class文件就是源代码针对于java虚拟机的"注解版" ,将你知道的语法表示出来
而后还有潜在的隐藏的信息,好比父类信息等
对于一个已经定义好的class文件,JVM须要进行一系列严格的验证
由于一个class文件可能不是由一个标准的编译器生成的也可能被别人恶意篡改过
因此JVM必须验证
验证以后还须要进行装载把数据信息装载到内存中,而后进行初始化等等
这就是JVM涉及到的部分
因此说想要弄明白java的运行原理须要了解清楚class文件的结构以及JVM的运行内存划分
使用javap查看编译后的文件
源代码
javap -v HelloWolrd.class 查看
上图中的信息没必要较真,我也是随便标注了个别比较好辨别的点
可是你彻底能够发现
class文件对于源文件的完整表述,类信息,字段信息 方法信息 涉及到的常量与其余类的调用等等
class文件是一张巨大的表
信息是单独存放的,能够把行号#XXX 理解成地址,
以下图所示,从头不断地根据地址信息串联起来,知道最终的叶子数据信息,造成一张巨大的信息表
好比
再次重申,这些就至关于JVM的机器语言了,有数据,有指令,JVM要作的就是解析执行了
固然,是一项很复杂的工做
另外javap还有不少其余命令