`

第二章(二) Java虚拟机结构-运行时数据区

阅读更多
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虚拟机,虚拟机中的数据类型

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

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

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

     本书共分20章,第1-4章解释了java虚拟机的体系结构,包括java栈、堆、方法区、执行引擎等;第5-20章深入描述了java技术的内部细节,包括垃圾收集、java安全模型、java的连接模型和动态扩展机制、class文件、运算及...

    深入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 ...

    深入Java虚拟机

    3.4.2 第二趟:类型数据的语义检查 3.4.3 第三趟:字节码验证 3.4.4 第四趟:符号引用的验证 3.4.5 二进制兼容 3.5 Java虚拟机中内置的安全特性 3.6 安全管理器和Java API 3.7 代码签名和认证 ...

    深入JAVA虚拟机(第2版)

    3.4.2 第二趟:类型数据的语义检查 3.4.3 第三趟:字节码验证 3.4.4 第四趟:符号引用的验证 3.4.5 二进制兼容 3.5 Java虚拟机中内置的安全特性 3.6 安全管理器和Java API 3.7 代码签名和认证 ...

    Java虚拟机

    这本书的内容是帮你全面了解java虚拟机,本书第1版两年内印刷近10次,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。第2版在第1版的基础上做了很大的...

    Java虚拟机规范(Java SE 7)

    第2章 Java虚拟机结构 ................................................. 21 2.1 Class文件格式 ................................................. 21 2.2 数据类型 .............................................

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    第2章 Java内存区域与内存溢出异常 / 24 2.1 概述 / 24 2.2 运行时数据区域 / 25 2.2.1 程序计数器 / 25 2.2.2 Java虚拟机栈 / 26 2.2.3 本地方法栈 / 27 2.2.4 Java堆 / 27 2.2.5 方法区 / 28 2.2.6 运行...

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

    第2章 Java虚拟机结构 ................................................. 21 2.1 Class文件格式 ................................................. 21 2.2 数据类型 .............................................

    java初学者必看

    1.7.3 Java虚拟机的体系结构 1.8 垃圾收集器 1.9 本章习题 第2章 Java开发环境 2.1 J2SE的下载和安装 2.1.1 J2SE的下载 2.1.2 J2SE的安装 2.2 环境变量的配置与测试 2.2.1 设置环境变量path 2.2.2 设置环境...

    计算机网络课程设计实验报告.docx.docx

    ---P13 运行结果 --------P19 第五章 心得体会 --------P21 总体设计 实体类设计 TCP、UPD、ICMP、ARP、广播数据包五个包的数据结构设计 功能类设计 网卡获取 包的抓捕 包的处理 界面设计 布局 按钮功能连接 第二章 ...

    Java进阶教程解密JVM视频教程

    第二章:内存结构 1. 程序计数器 2. 虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区 6. 直接内存 第三章:垃圾回收 1. 如何判断对象可以回收 2. 垃圾回收算法 3. 分代垃圾回收 4. 垃圾回收器 5. 垃圾回收调优 第四章:类...

    java基础案例与开发详解案例源码全

    2.5 Java虚拟机简介28 2.6 Java技术两种核心运行机制29 2.7 上机练习30 第3章 3.1 变量32 3.1.1 什么是变量32 3.1.2 为什么需要变量32 3.1.3 变量的声明和赋值33 3.1.4 变量应用实例33 3.2 数据的分类34 3.2.1 Java...

    张孝祥Java就业培训教程.pdf

    在第二章中,全面地讲解Java的基本语法知识,对基本语法的讲解也不是泛泛而谈,而是在其中贯穿各种实际应用中的巧妙用法和注意事项。在第三章和第四章中,透彻系统地讲解了面向对象的思想和应用。在以后的章节中,用...

    编程新手真言......

    第6章 抽象之数据结构 113 6.1 所谓数据结构 113 6.2 算法+数据结构的本质 115 6.4 算法不是设计 115 6.5 函数增长与算法复杂性分析 115 6.6 数据结构初步引象(1) 116 6.7 数据结构初步引象(2) 117 6.8 数据结构初步...

    Java开发技术大全 电子版

    第1章Java的开发运行环境2 1.1Java的运行环境与虚拟机2 1.2Java的开发环境4 1.2.1JDK的安装4 1.2.2如何设置系统环境变量6 1.2.3编译命令的使用8 1.2.4解释执行命令的使用10 1.2.5UltraEdit的使用11 1.3一个...

    计算机网络课程设计实验报告.docx

    界面设计 布局 按钮功能连接 第二章 详细设计 一、实体类实现 TCP、UPD、ICMP、ARP、广播数据包五个包的数据结构设计。 本程序采用Java编写,基于win10pcap。Win10pcap是winpcap在win10系统上的适用版本。Java对于...

Global site tag (gtag.js) - Google Analytics