《Java虚拟机规范》1.0笔记第二章数据类型、运行时的数据区
其他
2020-04-17 13:22:21
阅读次数: 0
数据类型
类型 |
大小 |
备注 |
byte |
8 |
|
short |
16 |
|
int |
32 |
|
long |
64 |
|
char |
16 |
指向基于多文本平面的Unicode码点,以UTF-16编码 |
float |
32 |
|
double |
64 |
|
boolean |
32 |
由于编译后JVM使用int数据类型来代替它,所以长度为32位,置于为啥用32位不用1位或者更小的byte来代替,是由于因为 CPU 寻址系统只能 32 位 32 位地寻址,具有高效存取的特点。true值用1表示,false用0 |
returnAddress |
|
指向某个操作码的指针(现基本已经启用) |
reference |
|
对象的引用,分为类类型、数组类型已经接口类型,数组类型最外面那维(存储)长度不由数组决定,被称为组件类型。(比如int[][][]的组件类型为int[][]) |
运行时数据区
主要结构表:
名称 |
范围 |
作用 |
大小 |
异常 |
PC寄存器 |
线程独有 |
保存当前方法正在执行的字节码的地址(native方法除外) |
|
|
Java虚拟机栈 |
线程独有 |
用于储存栈帧(局部变量和一些计算中间结果),只管栈帧的出入栈 |
可以预设大小,也可能自动调节 |
若请求分配的栈容量超过JVM允许的最大容量,便会抛出StackOverflowError异常;若可动态调整,无法申请到足够的内存或者创建新的线程时没有足够的内存去创建对应的虚拟机栈,抛出OutOfMemoryError异常 |
本地方法栈(C栈) |
线程独有 |
支持native方法的执行 |
同JVM栈 |
同JVM栈 |
Java堆 |
共享 |
存储了被GC所管理的各种对象实例 |
可预设可动态 |
若实际所需的堆超过了自动内存管理系统所能提供的最大容量,抛OutOfMemoryError异常 |
方法区 |
共享 |
存储每个类的结构信息,如运行时常量池、字段和方法数据、构造函数和普通方法的字节码内容还有一些类、实例、接口初始化用到的特殊方法,是堆的逻辑组成部分,不过可以选择不作为垃圾收集与压缩的区域,实际内存空间可以不连续 |
可以固定,可以动态 |
方法区的内存空间不能满足内存分配请求,那么Java虚拟机将抛出一个OutOfMemoryError异常 |
内部构成:
名称 |
作用 |
大小 |
归属 |
异常 |
运行时常量池 |
class文件中每个类或接口的常量池表的运行时表达形式 |
有方法区分配 |
方法区 |
超过方法区所能提供的最大值抛出OutOfMemoryError异常 |
栈帧 |
存储数据和部分过程结果同时也用来处理动态链接、方法返回值和异常分派 |
|
虚拟机栈,随方法的调用创建随方法结束销毁 |
|
栈帧构成:
名称 |
作用 |
大小 |
局部变量表 |
顾名思义保存方法内局部变量的,一个局部变量可以保存一个除long、double类型的所有类型(它俩需要俩),如果传入方法参数,0位参数一定是方法所属类的引用(this) |
长度由编译期决定 |
操作数栈 |
存储一些中间过程量,其中也包括调用方法的参数以及接受方法的返回结果的一个LIFO的栈 |
深度由编译期决定 |
动态链接 |
指向运行时常量池的引用 |
|
方法完成
- 正常完成:没有抛出异常正常完成,当前栈帧承担恢复调用者状态的责任。
- 异常完成:抛出了异常,就不会有方法返回值返回给调用者。
发布了18 篇原创文章 ·
获赞 1 ·
访问量 273
转载自blog.csdn.net/qq_38732834/article/details/105213697