java虚拟机规范一般都有哪些?

TheDisguiser 2020-06-06 15:08:36 java常见问答 4519

Java虚拟机编写代码需要遵守虚拟机的规范,否则程序就会让你知道什么是错误,下面我们来看看一般的java虚拟机规范有哪些吧。

一、栈帧规范

栈帧,具体的说急速jvm中常指的栈,虚拟机中的栈描述的是java方法执行的内存模型,它的所有方法在执行的同时会创建一个栈帧(Stack Frame),这个栈帧会用于存储局部变量表,动态链接,操作数栈及方法出口等信息,每个方法从调用到执行完成的过程就对应着一个栈帧在虚拟机栈中入栈道出栈的过程。局部变量表实际上就是该方法所在的类文件(二进制流文件)中的一部分。

jvm规范允许虚拟机栈使用固定的大小空间或动态使用扩展空间。

1)、stackOverflowError: If the computation in a thread requires a larger Java Virtual Machine stack than is permitted, the Java Virtual Machine throws a StackOverflowError。通常是在递归调用时出现该异常。

2)、OutOfMemoryError: If Java Virtual Machine stacks can be dynamically expanded, and expansion is attempted but insufficient memory can be made available to effect the expansion, or if insufficient memory can be made available to create the initial Java Virtual Machine stack for a new thread, the Java Virtual Machine throws an OutOfMemoryError.通常在申请了较多内存空间,但却没有释放的场景下出现。

二、堆规范

就是JVM中指的堆的地方,对一般程序来讲,java堆是虚拟机所管理的内存中最大的一块,这个区域的唯一目的就是存放对象实例和数组,理论上说所有的对象实例及数组都需要在堆上分配,它的这个部分是GC的主要管理区域,在java堆中还分为:新生代和老年代,java堆可以处于物理上不连续的内存空间中,只要在逻辑上连续即可,并且可以扩展(通过-xmx 和-xms控制,设置为相同就不可以扩展)。

三、方法区规范

通常用于存储已经被虚拟机加载的类信息、静态变量、常量信息和即时编译后的代码等数据,它不是一个堆。HotSpot虚拟机的设计团队选择把GC分代收集扩展至方法区,使用永久代来实现方法区。

四、基本数据类型规范

Java虚拟机中,分为基本类型与引用类型两种数据类型,所以也存在原始值和引用值两种类型的数值。它们可用于变量赋值、参数传递、方法返回和运算操作。

原始类型与值

Java虚拟机所支持的原始数据类型包括数值类型、boolean类型、和returnAddress类型

数值类型分为整数类型和浮点类型,分别是char,byte,short,int,long;浮点类型即float和double,这里和Java语言一致。

returnAddress,指返回地址的意思,returnAddress类型值指向一条虚拟机指令的操作码。它在虚拟机中比较典型的一个应用场景是用于jsr程序段落跳转,在try-catch异常处理以及finally代码块经常出现。和数值类的原生类型不同,returnAddress类型在Java语言之中并不存在相应的类型,而且也无法在程序运行期间修改。

虽然Java虚拟机中定义了boolean数据类型,但支持十分有限。在Java虚拟机中并没有任何供boolean值专用字节码指令。Java语言表达式所操作的boolean值,在编译之后都会使用Java虚拟机中的int数据类型来替代。

引用类型与值

Java虚拟机中有着三种引用类型:类的类型、数组类型与接口类型。它们分别指向动态创建的类实例、数组实例和某个接口的类实例或数组实例。

数组类型最外面那一堆元素的类型称为数组类型的组件类型。一个数组的组件类型也可以是数组。从任意一个数组开始,如果发现其组件类型也是数组类型,那么就继续读取这个小数组的组件类型,不断执行这一操作,最后一定悔遇到组件类型不是数组的情况,这时就把这种类型成为源数组的元素类型。一个数组的元素类型必须是原生类型、类类型或者接口类型之一。

在引用类型值中还有一个特殊的值:null,当一个引用不指向任何对象的时候,它的值就用null来表示。一个为null的引用,最初不会具备任何实际的运行期类型,但是它可以转型为任意的引用类型。引用类型的默认值就是null。

以上就是关于虚拟机规范的所有内容了,如果你还想要了解更多虚拟机相关java入门知识,烦请持续关注本网站吧。

推荐阅读:

JVM内存模型原理有哪些?

java虚拟机的作用是什么?我们为什么要用虚拟机?

java虚拟机是什么?基本结构是怎样的?