1. 数据类型
java虚拟具有的数据类型
- 原始类型(primitive type,基本类型/原生类型)
- 引用类型(reference type)
1.1 原始类型
原始数据类型包括 数值类型 ( 整数类型和浮点类型 )、boolean类型和returnAddress类型
- 1. 整数类型
- byte类型:值为8位有符号二进制补码整数,默认值为零,取值范围-128~127(即-27 ~ 27-1,包括-128和127)
- short类型:值为16位有符号二进制补码整数,默认值为零,取值范围-32768~32767(即-215 ~ 215-1,包括-32768和32767)
- int类型:值为32位有符号二进制补码整数,默认值为零,取值范围-2147483648~2147483647(即-231 ~ 231-1,包括-2147483648和2147483648)
- long类型:值为64位有符号二进制补码整数,默认值为零,取值范围0~65535,包括0和65535
- char类型:值为16位无符号整数表示,指向Unicode码点,UTF-8编码,默认值为Unicode的null码点(’\u0000’),取值范围-9223372036854775808~9223372036854775807(即-263 ~ 263-1,包括-2147483648和2147483648)
- 2. 浮点类型
- float类型:值为单精度浮点数集合,默认值为整数0
- double类型:值为双精度浮点数集合,默认值为整数0
- 3. boolean类型
值为true和false,默认值为false - 4. returnAddress类型
指向某个操作码的指针
1.2 引用类型
java虚拟机中有三种引用类型:类类型、数组类型、接口类型
当一个引用不指向任何对象的时候,它的值为null。一个为null的引用,起初并不具备任何实际的运行期类型,但是它可以转型为任意的引用类型。引用类型的默认值为null
2. 运行时数据区
java程序在运行时,用于存储数据的数据结构
2.1 PC寄存器
PC寄存器里面存储着正在执行的字节码指令的地址,如果执行的是native方法,pc寄存器保存的是undefined。
每一条java虚拟机线程都有自己的pc寄存器
2.2 java虚拟机栈
栈主要是用于存储栈帧的一种数据结构,它是基于线程的
每一条Java虚拟机线程的的栈都是私有的,栈和线程同时创建
2.2.1 栈帧
- 栈帧是用来存储数据(局部变量和方法的参数)和临时变量的数据结构,同时也用来处理动态链接、方法返回值和异常分派。
- 栈帧是基于方法的,随着方法调用而创建,方法结束而销毁
- 局部变量存储在栈帧的本地变量表中,临时变量或操作数存储于操作数栈中,用于数据的操作。本地变量表和操作数栈的容量大小在编译期时就已确定
- 每个栈帧内部都包含一个指向当前方法所在类的运行时常量池的引用,以便对当前方法的代码实现动态链接(即,将符号引用转换成实际的地址引用)。对于本类中的符号引用,在类加载器的解析阶段会将其解析成地址引用(直接引用),该阶段叫静态链接;对于其他类中的方法和变量的符号引用,是进行晚期绑定,即在执行到其他类中的方法或者变量时,在将符号引用解析成实际的地址引用
2.2.2 栈和栈帧的关系图
图片来源于网络
2.3 Java堆
- 在java虚拟机中,堆是可供各个线程共享的运行时内存区域,也是供所有类实例和数组对象分配内存的区域。
- java堆在java虚拟机启动时,就被创建。它由垃圾回收器进行堆内存的管理
下面两个参数可用于控制堆内存的分配:
-Xms128m JVM初始分配的堆内存
-Xmx512m JVM最大允许分配的堆内存,按需分配
2.4 方法区
方法区主要是用于保存一个类的结构信息,如运行时常量池、字段、方法数据、构造函数和普通方法的字节码
2.5 运行时常量池
运行时常量池是class文件中每一类或者接口的常量池的运行时表示形式。它包括编译期获得的字面量数据以及运行期解析后获取的方法或字段引用。类似C语言中的符号表
每一个运行时常量池在java虚拟机的方法去中分配。在类或接口被加载的时候,就创建运行时常量池
2.6 本地方法栈
java虚拟机在执行native方法的时候,可能会使用传统的栈来执行,这个栈就是本地方法栈
参考文献
JAVA虚拟机规范
https://blog.youkuaiyun.com/championhengyi/article/details/78760590