Frames (帧)
帧是用来存储数据和部分结果(Partial results)的,同时,也用与动态链接,方法的返回值并分发异常等。
当一个方法被调用时,就会创建一个新的帧(即方法和帧是紧密关联的)。当方法调用结束后(包括正常结束或异常退出,比如抛出一个未被捕捉的异常),帧会被销毁。帧是从JVM的栈里得到内存空间的。每一个帧都有它们自己的局域变量数组(Array of local variables),自己的操作数栈和一个指向当前方法所在类的常量池的指针。
局域变量数组和操作数栈的尺寸大小是在编译时就决定的,与该帧关联的方法的代码有关。
在一个指定的控制线程中,就只有正在被执行的方法(executing Method)的帧是活动状态的,所以该帧称为“当前帧”(Current Frame)。(当然,该方法就成为Current Method, 而该方法的类就称之为Current Class)。所有针对局部变量和操作数栈的操作都是针对当前帧的。
当一个方法调用其他方法或者该方法结束后,其帧就不再是当前帧了。当一个方法被调用后,一个新的帧就被创建了,而控制权也转移给了这个新的帧。当一个方法结束后,就将其返回结果(如果有)返回给了调用它的上一个帧。
需要注意的是,线程创建的帧是线程私有的,不能与另一个线程共享。
下面介绍Frames中的一些概念
Local Variables
每个帧都含有一个变量数组,我们称之为“局部变量区”(Local variables)。其长度在编译时已经确定了。
一个单独的局部变量可以容纳一个boolean、byte、char、short、int、float、reference或者returnAddress的值;一对局部变量的空间可以容纳一个long或者double的值。
JVM利用局部变量区来向方法传递参数。在类的方法(class method)调用中,参数是连续传递的,并且从局部变量的索性位置0开始算起。而一个实例方法(instance method)调用,索引号为0的局部变量中存放的是指向调用该方法的实例对象的指针,而方法的参数是从1开始存放的。(其实,实例方法的调用中,调用者的指针也是以隐藏参数的形式传进方法的,所以其索引位置为0)
Operand Stacks
每一个帧都含有一个后进先出(LIFO)的操作数栈,该栈的最大深度也是在编译期间就决定了。
当一个帧被创建的时候,它所包含的操作数栈还是空的。JVM中那些装载常量,装载局部变量或者域的值的操作会将获得的值放置到操作数栈中。其他的指令会从该操作数栈中获得操作数,并对它们进行操作,并将结果返回操作数栈。操作数栈用在向方法传递参数或从方法获得返回结果的准备工作中。
iadd命令表示将两个int值相加,它需要从获得操作数栈顶上的两个int值。这两个int值都会操作数栈中被pop出来,然后相加,然后它们的和被放回至操作数栈的顶端;
如图
JVM的操作指令必须是用于被操作的操作数的类型,比如,两个int值的操作数就不能被针对long型的操作指令操作。
Dynamic Linking (动态链接)
(这一段看的不是特别清楚,就把英文贴出来…)
Each frame contains a reference to the runtime constant pool for
the type of the current method to support dynamic linking of the method code. The
class file code for a method refers to methods to be invoked and variables to be
accessed via symbolic references.
每一个帧都包含一个指向当前方法所在类的运行时常量池(Runtime Constant Pool)的指针,该指针就是用来支持该方法代码的动态链接(Dynamic Linking)的。class文件的方法代码中包含了通过符号引用(Symbolic references) 来表示将要被调用的方法和将要被访问的常量。
Dynamic linking translates these symbolic
method references into concrete method references, loading classes as necessary
to resolve as-yet-undefined symbols, and translates variable accesses into appropriate
offsets in storage structures associated with the runtime location of these
variables.
动态链接就是将这些符号引用转变为固定的方法引用,并加载必须的类来解析那些尚未被定义的符号,并根据变量在运行时的位置将这些变量引用转变为存储解释中恰当的偏移量。(即将编译时不确定的在运行时变为确定的)
This late binding of the methods and variables makes changes in other classes
that a method uses less likely to break this code.
Normal Method Invocation Completion (正常的方法调用完成)
如果一个方法调用没有产生被抛出的异常(或者直接从JVM被抛出,或者从一个被显示声明的throw抛出),那么这个方法就是正常就完成调用。当一个方法正常完成后,一般会给该方法的调用者返回一个值。当前帧被用于存储调用者的状态,包括它的本地变量区和操作数栈,以及指向方法调用指令的program counter。在返回值(如果有)被push回调用者帧的操作数栈后,程序会继续在调用者的帧中继续运行。
Abrupt Method Invocation Completion (方法的异常退出)
同正常的相反,突发的就是指JVM运行某指令时抛出了某个异常,并且这个异常没有在方法中被处理掉后,方法就称之为异常退出(Complete Abruptly),一个athrow指令也会造成一个异常被显式的被抛出,当然,这是在该异常没有在方法内部被解决掉的情况。一个方法的异常退出不会给其调用者返回结果。
分享到:
相关推荐
【标题】"nginx-upstream-jvm-route-1.15" 涉及的核心知识点是Nginx的upstream模块与JVM路由的整合,特别针对Nginx 1.15版本。这个项目旨在解决在配置Nginx时遇到的特定错误提示“nginx: [emerg] invalid parameter ...
《深入JVM---JVM命令---invokespecial》 在Java虚拟机(JVM)的世界里,`invokespecial`指令扮演着至关重要的角色。它主要用于执行对象的构造方法(即`<init>`方法),以及调用私有方法和父类非静态方法。本文将...
Moonbox(月光宝盒)是JVM-Sandbox生态下的,基于jvm-sandbox-repeater重新开发的一款流量回放平台产品。在jvm-sandbox-repeater基础上提供了更加丰富功能,同时便于线上部署和使用,更多对比参考。 使用场景 你...
**Java虚拟机(JVM)基础** Java虚拟机(JVM)是Java平台的核心组成部分,它是Java程序运行的引擎。JVM负责解析字节码,执行类文件,并为应用程序提供了一个跨平台的运行环境。本资料《JVM基础-超清文字版.pdf》将...
"ssl-provider-jvm16-0.2.jar"是一个针对JVM 1.6的SSL(Secure Socket Layer)提供者。SSL是一种网络通信安全协议,主要用于确保数据在网络传输过程中的安全,通过使用公钥/私钥技术进行身份验证和数据加密。此提供...
1、java虚拟机的基本介绍。 2、字节码的执行 3、常用的jvm参数配置 4、算法和种类 5、gc参数配置 6、类加载器 7、性能监控工具 8、jvm堆栈分析
此资源有两个文件,含 nginx-upstream-jvm-route 和 nginx 对应版本,都是tar.gz文件。 安装方法网上很多就不写了,亲测可用。 不用担心版本不匹配造成安装失败,再浪费积分去到处下载尝试的烦恼。 此资源有两个文件...
赠送jar包:metrics-jvm-3.1.5.jar; 赠送原API文档:metrics-jvm-3.1.5-javadoc.jar; 赠送源代码:metrics-jvm-3.1.5-sources.jar; 赠送Maven依赖信息文件:metrics-jvm-3.1.5.pom; 包含翻译后的API文档:...
在这个压缩包中,"JVM图解.png"可能是对JVM内部结构的可视化表示,"JVM图解"可能是一个详细的文档,解释了JVM的工作原理,而"JVM指令手册 中文版"则提供了JVM可执行的所有指令的详细信息。下面,我们将深入探讨JVM的...
《Ant与Eclipse集成:JVM1.2版本1.0的jar.zip包解析》 在软件开发领域,Ant和Eclipse是两个重要的工具。Ant是Apache软件基金会下的一个Java项目,它是一个基于XML的构建工具,常用于自动化Java项目的构建、测试和...
kotlinx-coroutines-io-jvm-0.1.1.jar
赠送jar包:metrics-jvm-3.1.5.jar; 赠送原API文档:metrics-jvm-3.1.5-javadoc.jar; 赠送源代码:metrics-jvm-3.1.5-sources.jar; 赠送Maven依赖信息文件:metrics-jvm-3.1.5.pom; 包含翻译后的API文档:...
JVM 的运行机制 多线程 JVM 的内存区域 JVM 会创建操作系统的接口创建一个原生线程。JVM 线程和操作系统线程是一一对应的
nginx_upstream_jvm_route 是一个 Nginx 的扩展模块,用来实现基于 Cookie 的 Session Sticky 的功能。 安装方法(进入Nginx源码目录): #patch -p0 < /path/to/this/directory/jvm_route.patch # ./configure -...
jvm-npm, 适用于JVM的兼容CommonJS模块加载器 JVM上Javascript运行时中的NPM模块加载支持。 实现基于 http://nodejs.org/api/modules.html,应该完全兼容。 当然,不包括完整的node.js API,因此不要期望依赖于它的...
jar包:ssl-provider-jvm16-0.2
"JVM--字节码和类的加载篇1"这个标题暗示了我们将深入理解JVM如何处理字节码以及类加载的过程。 在Java的Class文件中,数据类型扮演着基础的角色。描述符是用来表示各种数据类型的,包括基本数据类型如byte、char和...
Java虚拟机(JVM)是Java程序运行的基础,它负责解释和执行字节码。在JVM中,内存管理是至关重要的,而`-Xms`, `-Xmx`, `-Xmn`, `-Xss`等参数则直接影响着Java应用程序的性能和稳定性。这些参数是用来调整JVM堆内存...
日常笔记-JVM内核-原理、诊断与优化
"nginx-upstream-jvm-route-0.1.tar.gz"正是为了解决这个问题而设计的一个解决方案。 首先,让我们了解一下Nginx的Upstream模块。Upstream模块允许Nginx将接收到的请求转发到一组后端服务器,可以根据配置的策略...