java虚拟机详解
java虚拟机指令dup详解

java虚拟机指令dup详解本⽂实例为⼤家介绍了java虚拟机指令dup,供⼤家参考,具体内容如下举个例⼦:public class ExceptionTest{void cantBeZero(int i) throws Exception{throw new Exception();}}上⾯代码编译后的字节码指令如下:void cantBeZero(int) throws ng.Exception;descriptor: (I)Vflags:Code:stack=2, locals=2, args_size=20: iload_11: ifne 124: new #2// class java/lang/Exception7: dup8: invokespecial #3// Method java/lang/Exception."<init>":()V11: athrow12: return1) 其中new指令在java堆上为Exception对象分配内存空间,并将地址压⼊操作数栈顶;2) 然后dup指令为复制操作数栈顶值,并将其压⼊栈顶,也就是说此时操作数栈上有连续相同的两个对象地址;3) invokespecial指令调⽤实例初始化⽅法<init>:()V,注意这个⽅法是⼀个实例⽅法,所以需要从操作数栈顶弹出⼀个this引⽤,也就是说这⼀步会弹出⼀个之前⼊栈的对象地址;4) athrow指令从操作数栈顶取出⼀个引⽤类型的值,并抛出;5) 最后由return指令结束⽅法。
从上⾯的五个步骤中可以看出,需要从栈顶弹出两个实例对象的引⽤,这就是为什么会在new指令下⾯有⼀个dup指令,其实对于每⼀个new指令来说⼀般编译器都会在其下⾯⽣成⼀个dup指令,这是因为实例的初始化⽅法肯定需要⽤到⼀次,然后第⼆个留给程序员使⽤,例如给变量赋值,抛出异常等,如果我们不⽤,那编译器也会⽣成dup指令,在初始化⽅法调⽤完成后再从栈顶pop出来。
java 虚拟机规范

java 虚拟机规范Java虚拟机规范(Java Virtual Machine Specification)是由Java语言设计者为了保证Java程序在任何平台上都能够运行,而定义的虚拟机的行为规范。
本文将详细介绍Java虚拟机规范,内容约1000字。
Java虚拟机规范定义了Java虚拟机(JVM)的结构、指令集、运行时数据区域、内存管理、异常处理、线程和同步等方面的规范。
通过遵循这些规范,开发者可以编写出具有良好可移植性和跨平台性的Java程序。
首先,Java虚拟机规范定义了JVM的结构。
JVM由类加载器、运行时数据区域、执行引擎和本地方法接口等组成。
类加载器负责加载类文件,并进行验证、解析和初始化。
运行时数据区域则包括了方法区、堆、虚拟机栈、本地方法栈和程序计数器等。
执行引擎根据操作码执行相应的指令,并对操作数栈和局部变量表进行操作。
本地方法接口则是Java虚拟机与本地操作系统的接口。
其次,Java虚拟机规范定义了JVM的指令集。
指令集包括了加载、存储、算术运算、类型转换、比较和控制流等各种指令。
每个指令都对应了Java虚拟机的一种行为,可以通过指定操作数来执行相应的操作。
Java虚拟机规范还定义了JVM的运行时数据区域。
运行时数据区域包括了方法区、堆、虚拟机栈、本地方法栈和程序计数器。
方法区用于存储类的结构信息、常量池、静态变量和方法等。
堆用于存储对象实例和数组。
虚拟机栈用于存储方法调用的局部变量表、操作数栈、动态链接和方法返回值等。
本地方法栈用于支持本地方法的调用。
程序计数器则用于记录当前线程执行的字节码指令地址。
此外,Java虚拟机规范还定义了JVM的内存管理、异常处理、线程和同步等方面的规范。
内存管理包括了垃圾收集和内存分配等。
异常处理定义了异常的分类、异常的处理流程和异常的处理方式。
线程规范包括了线程的创建、启动、执行和销毁等。
同步规范则定义了同步的机制和语义。
总结起来,Java虚拟机规范定义了Java虚拟机的行为规范,包括了JVM的结构、指令集、运行时数据区域、内存管理、异常处理、线程和同步等方面的规范。
java虚拟机的工作原理

java虚拟机的工作原理Java虚拟机(JVM)是Java程序运行的环境,它负责解释和执行Java字节码。
JVM的工作原理可以分为三个主要的部分:类加载、字节码执行和垃圾回收。
1.类加载:JVM通过类加载器将Java字节码加载到内存中。
类加载器根据类路径在文件系统或网络中查找并读取字节码文件,然后将其转化为JVM运行时数据结构,如类和方法的元数据。
加载完成后,JVM会在方法区中存储类的元数据,并在堆中分配内存来存储类的实例。
2.字节码执行:3.垃圾回收:JVM提供垃圾回收机制来自动释放不再使用的内存。
JVM会跟踪每个对象的引用,当一个对象没有引用时,即被视为垃圾。
垃圾回收器定期执行垃圾收集操作,释放垃圾对象占用的内存。
垃圾回收器有不同的实现策略,如标记-清除、引用计数、复制、标记-整理等。
除了以上三个主要的部分,JVM还包含其他组件,如堆内存、栈、方法区等。
堆内存用于存储对象实例,栈用于存储局部变量和方法调用参数,方法区用于存储类的元数据和静态数据。
JVM的工作过程如下:1. 通过类加载器加载Java字节码。
2.解释执行或JIT编译字节码。
3.根据需要进行垃圾回收和内存管理。
4.执行程序。
JVM的优点是跨平台性、自动内存管理和高性能。
通过JVM,Java程序可以在不同的硬件和操作系统上运行,无需修改源代码。
JVM的自动内存管理功能减轻了开发人员对内存管理的负担,避免了内存泄漏和越界访问等错误。
JVM的即时编译技术能够将热点代码优化为本地机器代码,提高程序的执行效率。
在实际的Java应用开发中,了解JVM的工作原理有助于编写高效的代码和解决性能问题。
开发人员可以通过调整JVM参数、选择合适的垃圾回收器和内存分配策略来优化程序的性能。
同时,了解JVM的工作原理还有助于理解虚拟机层面的问题和调优技巧,提升应用的可靠性和稳定性。
深入理解java虚拟机

深入理解java虚拟机(一)虚拟机内存划分Java虚拟机在执行Java程序时,会把它管理的内存划分为若干个不同的数据区。
这些区域有不同的特性,起不同的作用。
它们有各自的创建时间,销毁时间。
有的区域随着进程的启动而创建,随着进程结束而销毁,有的则始终贯穿虚拟机整个生命周期。
Java虚拟机运行时内存区域主要分为七部分,分别是:程序计数器,Java虚拟机栈,本地方法栈,方法区,Java堆,运行时常量池,直接内存。
如上图所示(图片来源于网络):蓝色区域包裹的部分为运行时几个数据区域:白色的部分为线程私有的,既随着线程的启动而创建。
每个线程都拥有各自的一份内存区域。
它们是:JAVA栈(JAVA STACK),本地方法栈(NATIVE METHOD STACK),和程序计数器(PROGRAM COUNTER REGISTER)。
黄色部分是线程共享的,所有的线程共享该区域的内容。
他们是:方法区(METHOD AREA),堆(HEAP)。
我们分别来介绍这些区域。
(1)程序计数器(program counter register)学过计算机组成原理的都知道计算机处理器中的程序计数器。
当处理器执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器中,此过程称为“取指令”。
与此同时,PC中的地址或自动加1或由转移指针给出下一条指令的地址。
此后经过分析指令,执行指令。
完成第一条指令的执行,而后根据PC取出第二条指令的地址,如此循环,执行每一条指令。
处理器的程序计数器是指寄存器,而java程序计数器是指一小块内存空间。
java代码编译字节码之后,虚拟机会一行一行的解释字节码,并翻印成本地代码。
这个程序计数器盛放的就是当前线程所执行字节码的行号的指示器。
在虚拟机概念模型中,字节码解释器工作室就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理等都依赖于它。
Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,因此为了线程切换后还能恢复执行位置,每条线程都需要一个独立的程序计数器。
recognizes class file version

recognizes class file version全文共四篇示例,供读者参考第一篇示例:Java虚拟机(Java Virtual Machine)是一种能够执行Java字节码的虚拟机,是Java程序运行的基础。
Java虚拟机可以在任何支持Java的平台上运行,这为跨平台开发提供了便利。
在Java编程中,我们通常会编写Java源代码,然后通过编译器将其编译成字节码文件。
而Java虚拟机会加载并执行这些字节码文件。
在加载字节码文件时,Java虚拟机会检查字节码文件的版本号,以确保其能够正确解析和执行。
Java虚拟机对于不同版本的Java字节码文件都有对应的支持,因此当我们编写Java程序时,需要根据所使用的Java开发工具版本来选择合适的Java字节码版本。
Java虚拟机能够识别和支持的Java字节码版本可以通过java -version命令查看。
Java字节码文件的版本号主要由主版本号和次版本号组成,例如45.0、46.0、47.0等。
主版本号用于表明Java编译器的主要版本,而次版本号则表示该版本的修订号。
Java虚拟机会根据主版本号来确定其是否支持该版本的字节码文件,如果不支持,则会抛出UnsupportedClassVersionError异常。
在Java 8之后,主要的Java版本发布如下:- Java SE 8对应的主版本号是52,是Java 8发布的版本。
- Java SE 9对应的主版本号是53,是Java 9发布的版本。
- Java SE 10对应的主版本号是54,是Java 10发布的版本。
- Java SE 11对应的主版本号是55,是Java 11发布的版本。
- Java SE 12对应的主版本号是56,是Java 12发布的版本。
- Java SE 13对应的主版本号是57,是Java 13发布的版本。
- Java SE 14对应的主版本号是58,是Java 14发布的版本。
JVM运行机制及其原理

JVM运行机制及其原理JVM(Java Virtual Machine)是Java虚拟机的缩写,是运行Java 字节码的虚拟计算机。
它是Java平台的核心组件,负责在不同的操作系统上执行Java程序。
JVM运行机制主要包括类加载、字节码解释、即时编译、垃圾收集等过程,下面将详细介绍JVM运行机制及其原理。
1.类加载当一个Java程序被运行时,JVM会首先加载程序的主类,然后根据程序的依赖关系逐步加载相关的类。
类加载过程主要分为加载、验证、准备、解析和初始化几个阶段:-加载:通过类加载器将类文件加载到内存中。
- 验证:确保加载的类符合Java语言规范和JVM规范。
-准备:为类的静态变量分配内存并初始化为默认值。
-解析:将符号引用转换为直接引用。
-初始化:执行类的初始化方法。
2.字节码解释加载完类文件后,JVM会通过解释器将字节码文件逐条解释执行,将每条字节码翻译成对应的机器代码并执行。
这种方式简单直接,但效率较低,适用于少量代码和频繁切换的情况。
3.即时编译4.垃圾收集JVM还负责管理程序的内存,包括分配内存、回收无用内存等。
在Java中,内存是通过堆和栈来管理的,堆用于存放对象实例,栈用于存放基本数据类型和方法调用。
JVM通过垃圾收集器来管理堆内存,自动回收不再使用的对象,并将内存释放出来供其他对象使用。
5.类加载器类加载器是JVM的重要组成部分,负责加载class文件,并将其转换成JVM可以识别的数据结构。
JVM中存在多个类加载器,分为三个级别:启动类加载器、扩展类加载器和应用程序类加载器。
类加载器采用双亲委派模型,当需要加载一个类时,先委托给父类加载器加载,只有当父类加载器无法找到类时,才由自己加载。
6.内存模型JVM中的内存分为程序计数器、虚拟机栈、本地方法栈、堆、方法区等几部分。
程序计数器记录当前指令执行的位置;虚拟机栈用于存放局部变量表和操作数栈;本地方法栈用于支持本地方法调用;堆用于存放对象实例;方法区用于存放类信息、静态变量等。
java的基本概念

java的基本概念Java的基本概念Java是一种高级编程语言,由Sun Microsystems于1995年推出,现在已被Oracle收购。
它是一种面向对象编程语言,适用于跨平台应用程序开发,因此广泛应用于Web、移动、桌面等各种领域。
在学习Java 编程之前,需要了解一些基本概念。
一、Java虚拟机(JVM)Java虚拟机是Java的重要组成部分之一,它是一个运行Java字节码的虚拟机,具有独立于硬件平台的特性。
JVM将Java字节码解释为机器指令,使Java程序能在各种操作系统上运行。
JVM还负责Java程序内存的分配和垃圾回收。
Java语言的安全性和可移植性也得益于JVM。
二、面向对象编程(OOP)Java是一种面向对象编程语言。
它的核心思想是将程序看作由对象组成,每个对象都有自己的属性和行为。
OOP的优点在于能够提高代码复用性,使得代码更易于扩展和维护,也有利于开发大型应用程序。
在Java中,所有的数据都是以对象的形式进行处理,常用的面向对象概念包括封装、继承和多态。
三、数据类型Java支持各种数据类型,包括基本数据类型和引用数据类型。
基本数据类型包括8种:byte、short、int、long、float、double、char和boolean,它们分别用于存储不同类型的数据。
引用数据类型包括类、接口、数组等类型。
Java还支持自动装箱和拆箱,即将基本数据类型自动转换为包装类型,方便代码的编写。
四、流程控制Java支持多种流程控制语句,包括顺序结构、选择结构和循环结构。
顺序结构是按照代码的顺序执行,选择结构根据条件选择不同的执行路径,循环结构则是重复执行同一个代码块。
Java还支持异常处理机制,即在程序运行时捕获异常并进行相应的处理,保证程序的健壮性和可靠性。
五、数组数组是Java中常用的数据结构之一。
它是一组固定大小的有序元素集合,可以存储同一类型的数据。
Java的数组可以是一维数组或多维数组,数组的下标从0开始计数。
深入剖析java虚拟机源码剖析与实例详解

深入剖析java虚拟机源码剖析与实例详解《深入剖析Java虚拟机源码剖析与实例详解》一书是近年来Java虚拟机领域的一本经典著作。
本文将从四个方面对这本书进行详细的剖析和评价。
一、内容概述本书主要从解读Java虚拟机的本质来讲解Java虚拟机,全书共分八个章节,内容分为虚拟机概述、运行时内存区域、执行引擎、类加载机制、字节码指令集和类文件结构六大块。
作者通过对Java虚拟机的实现原理剖析和对源代码关键代码的解析,帮助Java开发人员和技术爱好者更好地理解Java虚拟机的实现机制。
二、内容分析1. 虚拟机概述本章主要是介绍了Java虚拟机的工作原理、Java虚拟机与JDK、JRE的关系等,也阐述了一些JVM的基本概念和相应的JVM命令,如应用程序、类、对象、内存划分、垃圾回收、线程、栈等。
2. 运行时内存区域本章主要介绍Java虚拟机运行时内存的区域,分为线程共享区、堆、方法区、程序计数器,其中程序计数器是一种较为特殊的内存区域,主要用来记录线程正在执行的字节码指令的地址。
3. 执行引擎本章主要介绍Java虚拟机的执行引擎,执行引擎是JVM最具有特色的功能之一,主要起到将字节码翻译成具体的硬件指令的作用。
4. 类加载机制本章主要介绍Java类加载的机制,从类文件的加载、连接和初始化这三个阶段来解析。
5. 字节码指令集本章主要介绍了Java字节码指令集,这是Java虚拟机实现的关键之一。
字节码指令集是一个指令集,主要用来描述Java程序的行为。
6. 类文件结构本章主要介绍了Java类文件的内部结构,包括常量池、类信息、字段、方法等内容。
这些知识对于理解Java 虚拟机内部的运行机制和机制实现是非常有帮助的。
三、优点分析1. 按照设计和实现原理展开本书以Java虚拟机的设计原理和实现机制为主干,一步步推展,非常有条理和逻辑。
仔细分析每个过程,熟悉JVM的理论知识,加深JVM使用的理解,促进JVM的实际应用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
深入理解JVM1 Java技术与Java虚拟机说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API)。
它们的关系如下图所示:图1 Java四个方面的关系运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件)。
最后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行。
从上图也可以看出Java平台由Java虚拟机和Java应用程序接口搭建,Java 语言则是进入这个平台的通道,用Java语言编写并编译的程序可以运行在这个平台上。
这个平台的结构如下图所示:在Java平台的结构中, 可以看出,Java虚拟机(JVM) 处在核心的位置,是程序与底层操作系统和硬件无关的关键。
它的下方是移植接口,移植接口由两部分组成:适配器和Java操作系统, 其中依赖于平台的部分称为适配器;JVM 通过移植接口在具体的平台和操作系统上实现;在JVM 的上方是Java的基本类库和扩展类库以及它们的API,利用Java API编写的应用程序(application) 和小程序(Java applet) 可以在任何Java平台上运行而无需考虑底层平台, 就是因为有Java虚拟机(JVM)实现了程序与操作系统的分离,从而实现了Java 的平台无关性。
那么到底什么是Java虚拟机(JVM)呢?通常我们谈论JVM时,我们的意思可能是:1. 对JVM规范的的比较抽象的说明;2. 对JVM的具体实现;3. 在程序运行期间所生成的一个JVM实例。
对JVM规范的的抽象说明是一些概念的集合,它们已经在书《The Java Virtual Machine Specification》(《Java虚拟机规范》)中被详细地描述了;对JVM的具体实现要么是软件,要么是软件和硬件的组合,它已经被许多生产厂商所实现,并存在于多种平台之上;运行Java程序的任务由JVM的运行期实例单个承担。
在本文中我们所讨论的Java虚拟机(JVM)主要针对第三种情况而言。
它可以被看成一个想象中的机器,在实际的计算机上通过软件模拟来实现,有自己想象中的硬件,如处理器、堆栈、寄存器等,还有自己相应的指令系统。
JVM在它的生存周期中有一个明确的任务,那就是运行Java程序,因此当Java程序启动的时候,就产生JVM的一个实例;当程序运行结束的时候,该实例也跟着消失了。
下面我们从JVM的体系结构和它的运行过程这两个方面来对它进行比较深入的研究。
2 Java虚拟机的体系结构刚才已经提到,JVM可以由不同的厂商来实现。
由于厂商的不同必然导致JVM在实现上的一些不同,然而JVM还是可以实现跨平台的特性,这就要归功于设计JVM时的体系结构了。
我们知道,一个JVM实例的行为不光是它自己的事,还涉及到它的子系统、存储区域、数据类型和指令这些部分,它们描述了JVM的一个抽象的内部体系结构,其目的不光规定实现JVM时它内部的体系结构,更重要的是提供了一种方式,用于严格定义实现时的外部行为。
每个JVM都有两种机制,一个是装载具有合适名称的类(类或是接口),叫做类装载子系统;另外的一个负责执行包含在已装载的类或接口中的指令,叫做运行引擎。
每个JVM又包括方法区、堆、Java栈、程序计数器和本地方法栈这五个部分,这几个部分和类装载机制与运行引擎机制一起组成的体系结构图为:图3 JVM的体系结构JVM的每个实例都有一个它自己的方法域和一个堆,运行于JVM内的所有的线程都共享这些区域;当虚拟机装载类文件的时候,它解析其中的二进制数据所包含的类信息,并把它们放到方法域中;当程序运行的时候,JVM把程序初始化的所有对象置于堆上;而每个线程创建的时候,都会拥有自己的程序计数器和Java栈,其中程序计数器中的值指向下一条即将被执行的指令,线程的Java栈则存储为该线程调用Java 方法的状态;本地方法调用的状态被存储在本地方法栈,该方法栈依赖于具体的实现。
下面分别对这几个部分进行说明。
执行引擎处于JVM的核心位置,在Java虚拟机规范中,它的行为是由指令集所决定的。
尽管对于每条指令,规范很详细地说明了当JVM执行字节码遇到指令时,它的实现应该做什么,但对于怎么做却言之甚少。
Java虚拟机支持大约248个字节码。
每个字节码执行一种基本的CPU运算,例如,把一个整数加到寄存器,子程序转移等。
Java指令集相当于Java程序的汇编语言。
Java指令集中的指令包含一个单字节的操作符,用于指定要执行的操作,还有0个或多个操作数,提供操作所需的参数或数据。
许多指令没有操作数,仅由一个单字节的操作符构成。
虚拟机的内层循环的执行过程如下:do{取一个操作符字节;根据操作符的值执行一个动作;}while(程序未结束)由于指令系统的简单性,使得虚拟机执行的过程十分简单,从而有利于提高执行的效率。
指令中操作数的数量和大小是由操作符决定的。
如果操作数比一个字节大,那么它存储的顺序是高位字节优先。
例如,一个16位的参数存放时占用两个字节,其值为:第一个字节*256+第二个字节字节码。
指令流一般只是字节对齐的。
指令tableswitch和lookup是例外,在这两条指令内部要求强制的4字节边界对齐。
对于本地方法接口,实现JVM并不要求一定要有它的支持,甚至可以完全没有。
Sun公司实现Java本地接口(JNI)是出于可移植性的考虑,当然我们也可以设计出其它的本地接口来代替Sun公司的JNI。
但是这些设计与实现是比较复杂的事情,需要确保垃圾回收器不会将那些正在被本地方法调用的对象释放掉。
Java的堆是一个运行时数据区,类的实例(对象)从中分配空间,它的管理是由垃圾回收来负责的:不给程序员显式释放对象的能力。
Java不规定具体使用的垃圾回收算法,可以根据系统的需求使用各种各样的算法。
Java方法区与传统语言中的编译后代码或是Unix进程中的正文段类似。
它保存方法代码(编译后的java代码)和符号表。
在当前的Java实现中,方法代码不包括在垃圾回收堆中,但计划在将来的版本中实现。
每个类文件包含了一个Java类或一个Java界面的编译后的代码。
可以说类文件是Java语言的执行代码文件。
为了保证类文件的平台无关性,Java虚拟机规范中对类文件的格式也作了详细的说明。
其具体细节请参考Sun公司的Java 虚拟机规范。
Java虚拟机的寄存器用于保存机器的运行状态,与微处理器中的某些专用寄存器类似。
Java虚拟机的寄存器有四种:1. pc: Java程序计数器;2. optop: 指向操作数栈顶端的指针;3. frame: 指向当前执行方法的执行环境的指针;。
4. vars: 指向当前执行方法的局部变量区第一个变量的指针。
在上述体系结构图中,我们所说的是第一种,即程序计数器,每个线程一旦被创建就拥有了自己的程序计数器。
当线程执行Java方法的时候,它包含该线程正在被执行的指令的地址。
但是若线程执行的是一个本地的方法,那么程序计数器的值就不会被定义。
Java虚拟机的栈有三个区域:局部变量区、运行环境区、操作数区。
局部变量区每个Java方法使用一个固定大小的局部变量集。
它们按照与vars寄存器的字偏移量来寻址。
局部变量都是32位的。
长整数和双精度浮点数占据了两个局部变量的空间,却按照第一个局部变量的索引来寻址。
(例如,一个具有索引n的局部变量,如果是一个双精度浮点数,那么它实际占据了索引n和n+1所代表的存储空间)虚拟机规范并不要求在局部变量中的64位的值是64位对齐的。
虚拟机提供了把局部变量中的值装载到操作数栈的指令,也提供了把操作数栈中的值写入局部变量的指令。
运行环境区在运行环境中包含的信息用于动态链接,正常的方法返回以及异常捕捉。
动态链接运行环境包括对指向当前类和当前方法的解释器符号表的指针,用于支持方法代码的动态链接。
方法的class文件代码在引用要调用的方法和要访问的变量时使用符号。
动态链接把符号形式的方法调用翻译成实际方法调用,装载必要的类以解释还没有定义的符号,并把变量访问翻译成与这些变量运行时的存储结构相应的偏移地址。
动态链接方法和变量使得方法中使用的其它类的变化不会影响到本程序的代码。
正常的方法返回如果当前方法正常地结束了,在执行了一条具有正确类型的返回指令时,调用的方法会得到一个返回值。
执行环境在正常返回的情况下用于恢复调用者的寄存器,并把调用者的程序计数器增加一个恰当的数值,以跳过已执行过的方法调用指令,然后在调用者的执行环境中继续执行下去。
异常捕捉异常情况在Java中被称作Error(错误)或Exception(异常),是Throwable类的子类,在程序中的原因是:①动态链接错,如无法找到所需的class文件。
②运行时错,如对一个空指针的引用。
程序使用了throw语句。
当异常发生时,Java虚拟机采取如下措施:∙检查与当前方法相联系的catch子句表。
每个catch子句包含其有效指令范围,能够处理的异常类型,以及处理异常的代码块地址。
∙与异常相匹配的catch子句应该符合下面的条件:造成异常的指令在其指令范围之内,发生的异常类型是其能处理的异常类型的子类型。
如果找到了匹配的catch子句,那么系统转移到指定的异常处理块处执行;如果没有找到异常处理块,重复寻找匹配的catch子句的过程,直到当前方法的所有嵌套的catch子句都被检查过。
∙由于虚拟机从第一个匹配的catch子句处继续执行,所以catch子句表中的顺序是很重要的。
因为Java 代码是结构化的,因此总可以把某个方法的所有的异常处理器都按序排列到一个表中,对任意可能的程序计数器的值,都可以用线性的顺序找到合适的异常处理块,以处理在该程序计数器值下发生的异常情况。
∙如果找不到匹配的catch子句,那么当前方法得到一个"未截获异常"的结果并返回到当前方法的调用者,好像异常刚刚在其调用者中发生一样。
如果在调用者中仍然没有找到相应的异常处理块,那么这种错误将被传播下去。
如果错误被传播到最顶层,那么系统将调用一个缺省的异常处理块。
操作数栈区机器指令只从操作数栈中取操作数,对它们进行操作,并把结果返回到栈中。
选择栈结构的原因是:在只有少量寄存器或非通用寄存器的机器(如Intel486)上,也能够高效地模拟虚拟机的行为。
操作数栈是32位的。
它用于给方法传递参数,并从方法接收结果,也用于支持操作的参数,并保存操作的结果。
例如,iadd指令将两个整数相加。
相加的两个整数应该是操作数栈顶的两个字。