什么是JVM
Java 虚拟机是 Java 平台的基石。它是技术的组成部分,负责其硬件和操作系统的独立性、编译代码的小尺寸以及保护用户免受恶意程序侵害的能力。
Java 虚拟机是一个抽象的计算机器。像真正的计算机器一样,它有一个指令集并在运行时操纵各种内存区域。使用虚拟机实现编程语言是相当普遍的。最著名的虚拟机可能是 UCSD Pascal 的 P-Code 机器。
Java 虚拟机的第一个原型实现是在 Sun Microsystems, Inc. 完成的,它模拟了由类似于当代个人数字助理 (PDA) 的手持设备托管的软件中的 Java 虚拟机指令集。Oracle 当前的实现在移动、桌面和服务器设备上模拟 Java 虚拟机,但 Java 虚拟机不假定任何特定的实现技术、主机硬件或主机操作系统。它不是固有的解释,但也可以通过将其指令集编译为硅 CPU 的指令集来实现。它也可以在微代码中或直接在硅中实现。
Java 虚拟机对 Java 编程语言一无所知,只知道一种特定的二进制格式,即class文件格式。一个class文件包含的Java虚拟机指令(或字节码)和符号表,以及其它辅助信息。
为了安全起见,Java 虚拟机对class文件中的代码施加了很强的语法和结构约束。但是,任何具有可以用有效class文件表示的功能的语言都可以由 Java 虚拟机托管。被普遍可用的、独立于机器的平台所吸引,其他语言的实现者可以将 Java 虚拟机作为他们语言的交付工具。
(个人理解 通过编码来屏蔽不同操作系统间的差异)
优势特性
引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。java 著名的口号:一次编写,处处运行
Java 虚拟机的结构
1.class文件
由 Java 虚拟机执行的编译代码使用独立于硬件和操作系统的二进制格式表示,通常(但不一定)存储在文件中,称为class文件格式。该class文件格式精确定义的类或接口,其中包括详细信息,如字节顺序理所当然在特定平台的目标文件格式可能采取的代表性。
2.数据类型
与 Java 编程语言一样,Java 虚拟机对两种类型进行操作:原始类型 和引用类型。相应地,有两种值可以存储在变量中、作为参数传递、由方法返回和操作:原始值和引用值。
Java 虚拟机期望几乎所有类型检查都在运行时之前完成,通常由编译器完成,而不必由 Java 虚拟机本身完成。原始类型的值不需要被标记或以其他方式可检查以确定它们在运行时的类型,或者与引用类型的值区分开来。相反,Java虚拟机的指令集使用主要是在于对特定类型的值进行操作的指令来区分其操作数类型。例如,iadd、ladd、fadd和 dadd都是Java虚拟机指令添加两个数值,并产生数值结果,每个操作对应的数据类型: int,long,float,和double分别原始类型和值
在Java 虚拟机中, 一个对象要么是一个动态分配的类实例,要么是一个数组。对象的引用在Java 虚拟机中的类型是reference。reference类型的值可以被认为是指向对象的指针。一个对象可能存在多个引用。对象总是通过类型引用的值进行操作、传递和测试。
2.1.原始类型
2.1.1 整数类型
byte:8位 有符号 二进制补码整数,取值范围[-27,27-1],默认值为零;
short:16位 有符号 二进制补码整数,取值范围[-215,215-1],默认值为零;
int:32位 有符号 二进制补码整数,取值范围[-231,231-1],默认值为零;
long:64位 有符号 二进制补码整数,取值范围[-263,263-1],默认值为零;
char:16位 无符号 UTF-16编码Unicode值,取值范围[0,65535]默认值为null(’\u0000’);
2.1.2 浮点类型
float:32位 单精度浮点数集合,默认值正数零;
double:64位 双精度浮点数集合,默认值为正数零;
2.1.3 returnAddress类型
returnAddress :表示一条字节码指令的操作码,在JVM支持的原始类型中只有returnAddress类型不能直接与Java语言的数据类型对应的。
2.1.3 boolean类型
boolean :取值范围[true,false],默认值为false;
2.2.引用类型
有三种reference类型:类类型(动态创建的类实例)、数组类型(数组)和接口类型(实现接口的类实例)。
数组: 由单个维度的组件类型组成。
数组类型的组件类型本身可以是数组类型(多维数组)。
如果从任何数组类型开始,考虑它的组件类型,然后(如果它也是数组类型)该类型的组件类型,以此类推,最终必须达到一个不是数组类型的组件类型;
这称为数组类型的元素类型。数组类型的元素类型必须是基本类型、类类型或接口类型。 (这里相对拗口,其实相对来说 就是java中复杂的对象或者数组对象)
引用值也可以是特殊的空引用,即对no对象的引用,这里用null表示。空引用最初没有运行时类型,但可以转换为任何类型。引用类型的默认值为空。
JVM规范不强制要求值编码NULL (从而引发最常见的java.lang.NullPointException)
关注公众号回复:学习,领取海量技术书籍和面试资料