2.5 运行时数据区域
Java虚拟机定义了各种各样的运行时数据区,在程序执行过程中使用。这其中有些数据区域是在Java虚拟机启动时创建,只有在虚拟机结束时才被销毁。还有些数据区是各个线程的,线程的数据区在线程创建时创建,随线程的结束而销毁。
2.5.1 pc寄存器
Java虚拟机支持许多线程同时执行。每一个线程都有自己的pc(程序寄存器)。在任意时点,一个线程只能执行一个方法,称为这个线程的当前方法。如果这个方法不是本地方法,pc寄存器中存放着当前执行着的虚拟机指令的地址;如果当前方法是本地方法,则pc寄存器是未定义的。Java虚拟机的pc寄存器足够大的可以存下一个returnAddress类型的值或者特定平台的本地指针。
2.5.2 Java虚拟机栈
每个Java虚拟机线程都有一个自己Java虚拟机栈,在线程创建的时候创建。Java虚拟机栈存储栈帧,Java虚拟机栈可以类比于传统语言像C语言中的栈:它在方法调用和返回中用来,存储本地变量以及中间结果。Java虚拟机栈除了栈帧的出栈和进栈操作外不会被直接操作,栈帧有可能是从堆内存中分配的。Java虚拟机栈对应的存储区域不必是连续的。
虚拟机规范中允许虚拟机栈即可以是固定大小的,也可以是根据运算需求可收缩的。如果Java虚拟机的大小是固定的,当栈创建时各个线程虚拟机栈的大小是可以独立指定的。
Java虚拟机栈在以下情况下会出现异常
- 线程在计算过程中需求的栈大小超出了允许值,虚拟机将抛出StackOverflowError.
- 如果虚拟机栈设置的是可伸缩的,如果没有足够的内存来响应扩展,或者在线程船舰的时候,没有足够的内存来创建一个虚拟机栈,虚拟机将抛出OutOfMemoryError.
2.5.3 堆
Java虚拟机有个堆存储区域,由所有的虚拟机线程共享。所有的类实例和数组都是从堆这个运行时数据区域中分配内存的。
堆是在虚拟机启动时创建的。堆中存储的对象是通过自动存储管理系统(大家所熟知的垃圾回收机制)来进行回收的,对象不会显式的释放。Java虚拟机没有设定特定的自动存储管理系统,存储管理系统可以让虚拟机的实现者根据系统需要自动选择。堆得大小即可以是固定的也可以是可伸缩的,堆的存储区域不必是连续的。
堆会在以下情况下出现异常
- 当一个计算所需的堆空间大于存储管理系统可提供的大小时,虚拟机将抛出OutOfMemoryError.
2.5.4 方法区
Java虚拟机有一个方法区,由所有的虚拟机线程共享。方法区可以类比于传统语言中编译后的代码的存储区域或者类比于操作系统中的文本段。它存储了每个类的结构,比如运行时常量池、字段、方法的数据、以及方法和构造器的代码包括类、实例、接口的初始化等特殊方法。
方法区在Java虚拟机启动时创建。尽管方法区逻辑上是堆得一部分,简单的虚拟机实现中既不会对它用垃圾回收也不会压缩它。虚拟机规范既不要求方法区的位置,也不限定用来管理编译成的代码的策略。方法区的大小既可以是固定的也可以是可伸缩的。方法区的内存区域不必是连续的。
方法区会在以下情况出现异常
- 当方法区的内存不能满足一个内存分配的请求时,虚拟机将抛出OutOfMemoryError.
2.5.5 运行时常量池
运行时常量池是一个类或者一个接口在类文件中的常量表的运行时的表示。包含几种类别的常量,例如在编译时代表方法和字段的数值字面值,这些值是必须在运行时决定具体指定的对象。运行时常量池的功能类似于传统编程语言中的符号表,但是它比符号表包含的范围更加广泛。
所有的运行时常量池都是从虚拟机的方法区分配。一个类或接口的运行时常量池在这个类被虚拟机创建的时候构建。
- 当创建一个类或接口时,如果构造常量池需求的内存空间大于Java虚拟机方法区能提供的内存大小时,虚拟机将抛出OutOfMemoryError.
2.5.6 本地方法栈
Java虚拟机的实现者可能会用到传统意义的栈,通俗称为C栈,用来支持本地方法(用非Java语言编写的方法)。本地方法栈也可能用来在其他语言中来解释Java虚拟机的指令集,像C语言。虚拟机的实现者如果不需要加载本地方法,或者不需要传统意义的栈,则不必提供本地方法栈,如果提供的话,本地方法栈是随着每个线程创建而各自分配的。
本地方法栈在以下情况出现异常
- 如果一个线程的计算需要的本地方法栈大小超出了所允许的值,Java虚拟机将抛出StackOverflowError.
- 如果本地方法栈能够自动扩展,而当自动扩展时没有足够的内存可用,或者没有足够的内存用来初始化一个新的线程的本地方法栈,虚拟机将抛出OutOfMemoryError.
分享到:
相关推荐
#### 第二章 平台无关 - **平台无关的概念**:Java的设计初衷是为了实现“一次编写,到处运行”的理念,即通过Java虚拟机使得Java程序可以在任何安装了JVM的操作系统上运行。 - **Java平台**:Java平台由Java...
本书共分20章,第1-4章解释了java虚拟机的体系结构,包括java栈、堆、方法区、执行引擎等;第5-20章深入描述了java技术的内部细节,包括垃圾收集、java安全模型、java的连接模型和动态扩展机制、class文件、运算及...
第二章系统设计 MiniJavaVM 的系统设计分为两个主要部分:虚拟机总体框架和构成要素。 虚拟机总体框架 虚拟机总体框架包括命令参数解析模块、类的装载和解析模块、内存管理模块、执行引擎模块、方法调用模块和...
#### 第二章 系统设计 ##### 2.1 唯一的虚拟机MiniJavaVM MiniJavaVM的设计旨在简化JVM的概念模型,同时保持其核心功能。它的目标是提供一个易于理解和实现的教学示例。 ##### 2.2 MiniJavaVM的构成要素 ...
在“JAVA语言程序设计--第二章JAVA基础”这个主题中,我们主要探讨的是Java编程语言的基本概念和核心特性。Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司)于1995年发布。它以其“一...
第二部分则深入探讨了Java虚拟机的内部机制,涵盖了类的生命周期、链接模型、垃圾回收、栈和局部变量操作、类型转换等内容。 ### 第一部分:Java的架构 - **第1章:Java体系结构简介** - 提供了一个概览,介绍Java...
深入java虚拟机第二版 第1章 Java体系结构介绍 1.1 为什么使用Java 1.2 网络带来的挑战和机遇 1.3 体系结构 1.3.1 Java虚拟机 1.3.2 类装载器的体系结构 1.3.3 Java class文件 1.3.4 Java API 1.3.5 ...
3.4.2 第二趟:类型数据的语义检查 3.4.3 第三趟:字节码验证 3.4.4 第四趟:符号引用的验证 3.4.5 二进制兼容 3.5 Java虚拟机中内置的安全特性 3.6 安全管理器和Java API 3.7 代码签名和认证 ...
第二章:平台无关 平台无关性是Java的一大特点,这一章将深入探讨JVM如何实现这一特性。JVM通过Java Class文件格式和字节码,使得编译后的代码可以在任何支持JVM的平台上运行。这一章会涉及类文件结构、字节码指令集...
《深入理解Java虚拟机》是Java开发者深入了解JVM(Java Virtual Machine)的必备经典书籍,其第二版提供了原代码分析,帮助读者更直观地理解JVM的工作原理。这本书的各个章节涵盖了从内存管理到垃圾回收,从类加载...
3.4.2 第二趟:类型数据的语义检查 3.4.3 第三趟:字节码验证 3.4.4 第四趟:符号引用的验证 3.4.5 二进制兼容 3.5 Java虚拟机中内置的安全特性 3.6 安全管理器和Java API 3.7 代码签名和认证 ...