Java虚拟机结构
数据类型
- JVM操作的数据类型分两类:原始类型(基本类型)和引用类型,与之对应,也存在原始值和引用值,它们可用于变量赋值、参数传递、方法返回和运算操作。
- 编译器会在编译期尽最大可能的完成类型检查,使JVM在运行期无需这些操作。
- 原始类型的值不需要在运行期确定它们的数据类型,也不需要与引用类型的值区分开,因为JVM的字节码指令本身就可以确定它的操作数的类型。
- JVM直接支持对象。对象可以是动态分配的某个类的实例,也可以是数组。
- JVM中使用reference类型表示对某个对象的引用。reference类型的值可看成指向对象的指针。每一个对象都可能存在多个指向它的引用,对象的操作、传递、检查都通过引用它的reference类型的数据来进行。
原始类型
- JVM支持的原始类型:数值类型、boolean类型和returnAddress类型三类。
- 数值类型分为:整数类型和浮点类型。
- 整数类型:byte 8位、short 16位、int 32位、long 64位、char 16位、float 32位 、double 64位、boolean类型
- returnAddress类型:指向某个操作码的指针,此操作码与JVM指令相对应。所有原始类型中只有returnAddress类型不能直接与Java语言数据类型相对应。
引用类型
- JVM三种引用类型:类类型、数组类型、接口类型。它们的值分别指向动态创建的类实例、数组实例和实现了某个接口的类实例或数组实例。
- 引用类型特殊值:null值,当一个引用不指向任何对象时,它的值就用null表示。
pc寄存器
- 每条JVM线程都有自己的pc寄存器。
- 在任意时刻,一条JVM线程只会执行一个方法的代码,如果此方法不是native的,pc寄存器保存JVM正在执行的字节码的地址。如果是native的,pc寄存器的值是undefined。
- pc寄存器的容量至少能保存一个returnAddress类型的数据或一个与平台相关的本地指针的值。
Java虚拟机栈
- 线程私有的,生命周期和线程一样,用来保存new对象的引用的。
- JVM栈除了栈帧的出栈和入栈之外,JVM不受其他因素的影响,JVM栈内存不需要保证是连续的。
- 存储局部变量
栈帧(本地私有)
- 随方法调用而创建,随方法结束而销毁
- 有自己的局部变量表、操作数栈、指向当前方法所属类的运行时常量池
Java堆(线程共享,空间不连续)
- 为类实例和数组对象分配内存
方法区(线程共享,在堆中)
- 存储类的各种信息,如:类名,方法名,变量等
运行时常量池(在方法区中)
- 加载类和接口的时候,当中的常量就放在常量池中
本地方法栈
- 存放本地方法的,有关键字native的方法