`
java鸵鸟
  • 浏览: 2357 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java虚拟机运行时数据区

 
阅读更多
Java虚拟机 运行时数据区
1.PC寄存器(Program Counter)
JVM可以同时运行多个线程,每个线程对应有自己的PC寄存器。
如果JVM当前运行的方法是非Native方法,那么PC寄存器中保存的是JVM正在执行的字节码指令的地址。
如果当前运行的方法是Native方法,PC寄存器中保存的值是undefined。

2.Java虚拟机栈(Java Virtual Machine Stack)
每条线程对应有自己的虚拟机栈,虚拟机栈中存储着栈帧(Frame)。

3.Java堆
各条线程共享的运行时内存区域,堆(Heap)供所有类实例和数组对象分配内存。
Java堆是垃圾收集器(Garbage Collector)的主要操作对象。

4.方法区(Method Area)
各条线程共享的运行时内存区域。
存储了每一个类的结构信息,例如运行时常量池,字段,方法数据,构造函数和普通方法的字节码内容等等。
方法区在虚拟机启动的是被创建。

5.运行时常量池(Runtime Constant Pool)
每个类和或接口的常量池的运行时表示形式,它包括了若干种不同的常量:从编译期可知的数值字面量到必须运行期解析后才能获得的方法或字段引用。

6.本地方法栈(Native Method Stack)
Java虚拟机实现可能会使用到传统的栈(通常称之为“C Stacks”)来支持native方法(指使用Java以外的其他语言编写的方法)的执行,
这个栈就是本地方法栈。当Java虚拟机使用其他语言(例如C语言)来实现指令集解释器时,也会使用到本地方法栈。

7.栈帧(Frame)
栈帧用来存储数据和部分过程结果的数据结构,同时也被用来处理动态链接,方法返回值和异常分配。
栈帧随着方法调用而分配,方法结束而销毁。无论方法是正常结束,还是抛出异常都作为方法结束。
栈帧存储在Java虚拟机栈中,每个栈帧都有自己的局部变量表,操作数栈和指向当前方法所属的类的运行时常量池的引用。
在一条线程之中,只有目前正在执行的那个方法的栈帧是活动的。这个栈帧就被称为是当前栈帧(Current Frame),
这个栈帧对应的方法就被称为是当前方法(Current Method),定义这个方法的类就称作当前类(Current Class)。
对局部变量表和操作数栈的各种操作,通常都指的是对当前栈帧的对局部变量表和操作数栈进行的操作。

7.1 局部变量表(Local Variables)
每个栈帧内部都包含一组称为局部变量表的变量列表。
一个局部变量可以保存一个类型为Boolean、Byte、Short、float、reference和returnAddress的数据,两个局部变量可以保存类型为Double和long的数据。
局部变量表使用索引来定位和访问,第一个局部变量的索引值为0。

7.2 操作数栈(Operand Stack)
每个栈帧内部都包含一个称为操作数栈的先进后出(FIFO)栈。
操作数栈所属的栈帧在刚刚被创建的时候,操作数栈是空的。Java虚拟机提供一些字节码指令来从局部变量表或者对象实例的字段中复制常量或变量值到操作数栈中,
也提供了一些指令用于从操作数栈取走数据、操作数据和把操作结果重新入栈。在方法调用的时候,操作数栈也用来准备调用方法的参数以及接收方法返回结果。
每一个操作数栈的成员(Entry)可以保存一个Java虚拟机中定义的任意数据类型的值,包括long和double类型。
在操作数栈中的数据必须被正确地操作,这里正确操作是指对操作数栈的操作必须与操作数栈栈顶的数据类型相匹配,例如不可以入栈两个int类型的数据,
然后当作long类型去操作他们,或者入栈两个float类型的数据,然后使用iadd指令去对它们进行求和。

7.3 动态链接(Dynamic Linking)
每一个栈帧内部都包含一个指向运行时常量池的引用来支持当前方法的代码实现动态链接。
在Class文件里面,描述一个方法调用了其他方法,或者访问其成员变量是通过符号引用(Symbolic Reference)来表示的,
动态链接的作用就是将这些符号引用所表示的方法转换为实际方法的直接引用。
类加载的过程中将要解析掉尚未被解析的符号引用,并且将变量访问转化为访问这些变量的存储结构所在的运行时内存位置的正确偏移量。

7.4 方法正常调用完成
方法正常调用完成是指在方法的执行过程中,没有任何异常被抛出——包括直接从Java虚拟机之中抛出的异常以及在执行时通过throw语句显式抛出的异常。
如果当前方法调用正常完成的话,它很可能会返回一个值给调用它的方法,方法正常完成发生在一个方法执行过程中遇到了方法返回的字节码指令的时候,
使用哪种返回指令取决于方法返回值的数据类型(如果有返回值的话)。
在这种场景下,当前栈帧承担着回复调用者状态的责任,其状态包括调用者的局部变量表、操作数栈和被正确增加过来表示执行了该方法调用指令的程序计数器等。
使得调用者的代码能在被调用的方法返回并且返回值被推入调用者栈帧的操作数栈后继续正常地执行。

7.5 方法异常调用完成
方法异常调用完成是指在方法的执行过程中,某些指令导致了Java虚拟机抛出异常,并且虚拟机抛出的异常在该方法中没有办法处理,
或者在执行过程中遇到了athrow字节码指令显式地抛出异常,并且在该方法内部没有把异常捕获住。如果方法异常调用完成,
那一定不会有方法返回值返回给它的调用者。
分享到:
评论

相关推荐

    java虚拟机运行时数据区分析

    Java虚拟机运行时数据区分析 Java虚拟机(JVM)是一种抽象的计算机,它提供了一个运行Java字节码的环境。JVM将Java源代码编译为字节码,并在运行时执行这些字节码。为了更好地理解JVM的工作原理,我们需要了解JVM的...

    Java虚拟机运行机制

    Java虚拟机运行机制 Java虚拟机(JVM)是一种用于计算设备的规范,可以用不同的方式(软件或硬件)加以实现。JVM包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 Java虚拟机是一个...

    深入java虚拟机.pdf

    Java 虚拟机的体系结构由多个子系统组成,包括类加载器子系统、执行引擎、数据区等。类加载器子系统负责加载程序中的类型(类和接口),并赋予唯一的名字。执行引擎负责执行被加载类中包含的指令。数据区中保存了...

    Java虚拟机(Java VM) msjavax86 微软java虚拟机

    Java虚拟机的内部结构包括类装载器、运行时数据区、执行引擎、本地方法接口和本地库。其中,类装载器负责加载类文件,运行时数据区存储线程的工作数据,执行引擎解析并执行字节码,本地方法接口允许JVM调用非Java...

    Java虚拟机规范.Java SE 8版

    第2章概述Java虚拟机的整体架构,包括class文件格式、数据类型、原始类型、引用类型、运行时数据区、栈帧、浮点算法、异常等,这对理解本书后面的内容有重要帮助;第3章详述如何将Java语言编写的程序转换为Java...

    Java虚拟机运行时数据区域汇总

    主要给大家介绍了关于Java虚拟机运行时数据区域的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    java虚拟机

    JVM通过类加载器将这些字节码加载到内存中,进行验证、准备、解析和初始化等步骤,形成运行时的数据区。 2. **运行时数据区**:包括堆内存、方法区、虚拟机栈、本地方法栈和程序计数器。堆是所有对象实例的存储区域...

    Java虚拟机规范.Java SE 8版.zip

    第2章概述Java虚拟机的整体架构,包括class文件格式、数据类型、原始类型、引用类型、运行时数据区、栈帧、浮点算法、异常等,这对理解本书后面的内容有重要帮助;第3章详述如何将Java语言编写的程序转换为Java...

    03 运行时数据区概述及线程.pptx

    03 JVM 运行时数据区概述及线程的 PPT 重绘。讲述 Java 虚拟机 运行时数据区所处位置,结构划分,以及各个区域与线程的关系。

    Java虚拟机规范(Java SE 7)中文版

    第2章概览了Java虚拟机整体架构,包括class文件格式、数据类型、原始类型、引用类型、运行时数据区、栈帧、浮点算法、异常等,这对理解本书后面的内容有重要帮助。第3章详述如何将Java语言编写的程序转换为Java...

    MiniJavaVM—个Java虚拟机的设计和实现

    4. 运行时数据区(Runtime Data Area):负责存储 Java 应用程序的运行时数据。 MiniJavaVM 的功能 MiniJavaVM 的主要功能包括: 1. Java 字节码的加载和解析 2. 类的装载和解析 3. 方法的调用和执行 4. 异常的...

    【带书签】Java虚拟机规范(Java SE 7).pdf

    了Java虚拟机整体架构,包括class文件格式、数据类型、原始类型、引用类型、运行时数据区、栈帧、浮点算法、异常等,这对理解本书后面的内容有重要帮助。第3章详述如何将Java语言编写的程序转换为Java虚拟机指令集,...

    Java虚拟机规范(Java SE 7).pdf

    《Java虚拟机规范(Java SE 7)》是Java开发者深入理解Java运行机制的重要参考资料,它详细阐述了Java虚拟机(JVM)的工作原理和内存管理机制... 在Java SE 7版本中,JVM进行了多项改进和增强,其中...

    JAVA虚拟机解读入门

    2. 运行时数据区:包括堆、方法区、栈、本地方法栈和程序计数器。每个线程都有自己独立的栈和程序计数器,而堆和方法区则是所有线程共享的。 - 堆:存储对象实例,是JVM中最大的内存区域,也是垃圾收集的主要区域。...

    Java虚拟机规范 深入java虚拟机

    它包含类装载器、运行数据区、执行引擎、本地方法接口和本地方法库等组成部分。 2. **类装载器** 类装载器负责将类文件从文件系统或网络中加载到JVM中。它遵循双亲委派模型,确保类的唯一性,并允许自定义类装载器...

    java虚拟机规范 jdk8.

    第2章概述Java虚拟机的整体架构,包括class文件格式、数据类型、原始类型、引用类型、运行时数据区、栈帧、浮点算法、异常等,这对理解本书后面的内容有重要帮助;第3章详述如何将Java语言编写的程序转换为Java...

    java虚拟机.doc

    Java虚拟机 Java虚拟机(Java Virtual Machine,JVM)是Java技术栈的核心组件之一。它负责将Java字节码文件转换为机器码,并执行这些机器码以实现...这些区域都是Java虚拟机运行所必需的,它们之间的关系紧密相连。

    Java虚拟机的安装程序

    4. **运行时数据区**:JVM划分了不同的内存区域,包括堆、栈、方法区、程序计数器、本地方法栈等。其中,堆是对象实例的存储区域,栈则用于存储方法调用的信息。 5. **执行引擎**:这是JVM的核心,负责解释或即时...

Global site tag (gtag.js) - Google Analytics