Java虚拟机(JVM源码):JDK10对Java虚拟机运行时数据区的划分(详细图解)

2023-11-01

Java虚拟机运行时数据区

为什么要研究这个,因为JDK都已经发布到10了,必须要更新自己对Java虚拟机新的认识。

一、运行时数据区的划分

1.1 官方划分

关于JDK10对运行时数据区的划分,在官方文档说的非常清楚。
学习技术,一定要学会看第一手资料。

Java虚拟机规范基于JDK10地址

1.2.根据文档绘数据区图

注意:
线程共享:堆、方法区
线程私有:栈、本地方法栈、程序计数器

这里写图片描述

1.3 运行时数据区

Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。其中一些数据区域是在Java虚拟机启动时创建的,仅在Java虚拟机退出时销毁。其他数据区域是每个线程。线程数据区域是在线程退出时创建和销毁线程时创建的。

二、Java虚拟机规范(基于JDK10的解释)

2.1 The pc Register

程序计数器(寄存器)
Java虚拟机可以同时支持许多执行线程(JLS§17)。每个Java虚拟机线程都有自己的 pc(程序计数器)寄存器。在任何时候,每个Java虚拟机线程都在执行单个方法的代码,即该线程的当前方法。如果该方法不是 native,则pc寄存器包含当前正在执行的Java虚拟机指令的地址。如果线程当前正在执行该方法native,则Java虚拟机pc 寄存器的值未定义。Java虚拟机pcregister足够宽,可以returnAddress在特定平台上保存或指向本机指针。

2.2 Java Virtual Machine Stacks

Java虚拟机栈
每个Java虚拟机线程都有一个私有Java虚拟机栈,与线程同时创建。Java虚拟机栈存储帧(第2.6节)。Java虚拟机栈类似于传统语言的栈,例如C:它保存局部变量和部分结果,并在方法调用和返回中起作用。由于除了推送和弹出帧之外,永远不会直接操作Java虚拟机栈,因此可以对堆进行堆分配。Java虚拟机栈的内存不需要是连续的。

在第一版中的Java ®虚拟机规范,Java虚拟机堆被称为Java堆栈。

此规范允许Java虚拟机栈具有固定大小或根据计算的需要动态扩展和收缩。如果Java虚拟机栈具有固定大小,则可以在创建该栈时独立选择每个Java虚拟机堆栈的大小。

Java虚拟机实现可以为程序员或用户提供对Java虚拟机栈的初始大小的控制,以及在动态扩展或收缩Java虚拟机栈的情况下,控制最大和最小大小。

以下异常条件与Java虚拟机栈相关联:

  • 如果线程中的计算需要比允许的更大的Java虚拟机栈,则Java虚拟机会抛出一个StackOverflowError。
  • 如果可以动态扩展Java虚拟机栈,并且尝试进行扩展但可以使内存不足以实现扩展,或者可以使内存不足以为新线程创建初始Java虚拟机栈,则可以使用Java虚拟机堆栈机器抛出一个OutOfMemoryError。

2.3 Heap


Java虚拟机具有在所有Java虚拟机线程之间共享的堆。堆是运行时数据区,从中分配所有类实例和数组的内存。

堆是在虚拟机启动时创建的。对象的堆存储由自动存储管理系统(称为垃圾收集器)回收 ; 对象永远不会被显式释放。Java虚拟机假设没有特定类型的自动存储管理系统,可以根据实现者的系统要求选择存储管理技术。堆可以是固定大小的,或者可以根据计算的需要进行扩展,如果不需要更大的堆,则可以收缩。堆的内存不需要是连续的。

Java虚拟机实现可以为程序员或用户提供对堆的初始大小的控制,以及如果可以动态扩展或收缩堆,则控制最大和最小堆大小。

以下异常情况与堆相关联:

  • 如果计算需要的堆量超过自动存储管理系统可用的堆,则Java虚拟机会抛出一个 OutOfMemoryError。

2.4 Method Area

方法区
Java虚拟机具有在所有Java虚拟机线程之间共享的方法区域。方法区域类似于传统语言的编译代码的存储区域或类似于操作系统进程中的“文本”段。它存储每类结构,例如运行时常量池,字段和方法数据,以及方法和构造函数的代码,包括类和接口初始化以及实例初始化(第2.9节)中使用的特殊方法。

方法区域是在虚拟机启动时创建的。虽然方法区域在逻辑上是堆的一部分,但是简单的实现可能选择不垃圾收集或压缩它。此规范不强制方法区域的位置或用于管理编译代码的策略。方法区域可以是固定大小的,或者可以根据计算的需要进行扩展,并且如果不需要更大的方法区域,则可以缩小方法区域。方法区域的内存不需要是连续的。

Java虚拟机实现可以为程序员或用户提供对方法区域的初始大小的控制,以及在变大小方法区域的情况下,控制最大和最小方法区域大小。

以下异常条件与方法区域相关联:

  • 如果方法区域中的内存无法满足分配请求,则Java虚拟机会抛出OutOfMemoryError。

2.5 Run-Time Constant Pool

运行时常量池
甲运行时间常数池是的每个类或每个接口的运行时表示constant_pool在表class文件(§4.4)。它包含几种常量,从编译时已知的数字文字到必须在运行时解析的方法和字段引用。运行时常量池提供类似于传统编程语言的符号表的功能,尽管它包含比典型符号表更宽范围的数据。

每个运行时常量池都是从Java虚拟机的方法区域(第2.5.4节)中分配的。当Java虚拟机创建类或接口(第5.3节)时,将构造类或接口的运行时常量池。

以下异常条件与类或接口的运行时常量池的构造相关联:

  • 在创建类或接口时,如果运行时常量池的构造需要的内存比Java虚拟机的方法区域中可用的内存多,则Java虚拟机会抛出一个OutOfMemoryError。

2.6 Native Method Stacks

本地方法栈
Java虚拟机的实现可以使用传统的堆栈,俗称“C堆栈”,以支持native方法(用Java编程语言以外的语言编写的方法)。
本机方法堆栈也可以用于以诸如C语言的Java虚拟机的指令集的解释器的实现来使用。无法加载native 方法并且本身不依赖于传统堆栈的Java虚拟机实现不需要提供本机方法堆栈。 。如果提供,则通常在创建每个线程时为每个线程分配本机方法堆栈。

此规范允许本机方法堆栈具有固定大小或根据计算的需要动态扩展和收缩。如果本机方法堆栈具有固定大小,则可以在创建该堆栈时独立地选择每个本机方法堆栈的大小。

Java虚拟机实现可以为程序员或用户提供对本机方法堆栈的初始大小的控制,以及在不同大小的本机方法堆栈的情况下,控制最大和最小方法堆栈大小。

以下异常条件与本机方法堆栈相关联:

  • 如果线程中的计算需要比允许的更大的本机方法堆栈,则Java虚拟机会抛出一个StackOverflowError。
  • 如果可以动态扩展本机方法堆栈并尝试进行本机方法堆栈扩展,但可以使内存不足,或者如果没有足够的内存可用于为新线程创建初始本机方法堆栈,则Java虚拟机会抛出OutOfMemoryError。

好啦,关于Java虚拟机的内存划分,先聊这么多。
光知道肯定还是不够的。需要多加实践和理解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java虚拟机(JVM源码):JDK10对Java虚拟机运行时数据区的划分(详细图解) 的相关文章

  • 栈 - 关于出栈序列,判断合法的出栈序列

    文章目录 1 引例 2 做题方法 3 原因 3 1 选项D 4 3 1 2 的模拟 1 引例 例 设栈的入栈序列是 1 2 3 4 则下列不可能是其出栈序列的是 A 1 2 4 3 B 2 1 3 4 C 1 4 3 2 D 4 3 1 2
  • Linux 网络协议栈开发(二)—— 二层桥转发基础

    做为网络设备 二层转发是最基本的功能 要想继续学习linux 内核协议栈 必须明白二层转发的流程 这篇文章举例讲一讲二层转发的流程 二层转发是根据报文的目的MAC直接进行转发 转发过程中不用对报文的头部做任何的修改 三层转发是根据报文的ip
  • 递归实现栈的翻转

    递归实现栈的翻转 主要考察对于递归的理解 其实这个问题最简单的方法当然是设计一个空的栈来存储这些元素 一次达成逆序 但是题目要求使用递归的方式实现逆序 因此需要借助函数返回栈来充当这个这个栈的作用 实际上依然是借助了一个栈 但是这个栈是函数
  • 数据结构--一个数组实现两个栈

    用一个数组实现两个栈 通常我们会想到以下几种方案 1 奇偶栈 即就是将数组的偶数位置看作一个栈的存储空间 将奇数位置看作另一个栈的存储空间 2 从中间分别向两边展开 即就是将数组的中间位置看作是两个栈的栈底 压栈时栈顶指针分别向两边移动 当
  • JVM运行原理及Stack和Heap的实现过程

    Java语言写的源程序通过Java编译器 编译成与平台无关的 字节码程序 class文件 也就是0 1二进制程序 然后在OS之上的Java解释器中解释执行 而JVM是java的核心和基础 在java编译器和os平台之间的虚拟处理器 注 本网
  • 两个栈实现一个队列(图解),一看就懂

    两个栈实现一个队列 要想实现此方法 我们现需要了解一下什么是栈和队列 栈 栈 Stack是一种只能在一端进行插入或删除操作的线性表 表中允许进行插入 删除操作的一端称为栈顶 Top 栈顶的当前位置是动态的 栈顶的当前位置是由一个称为栈顶指针
  • 09黑马笔记之栈的应用_中缀表达式转后缀表达式

    09黑马笔记之栈的应用 中缀表达式转后缀表达式 1 前提 1 数字 直接输出 2 左括号 直接进栈 优先级默认最低 3 右括号 将栈顶符号输出 直到匹配到左括号 4 运算符 1 若一开始没有可比较直接进栈 2 若栈顶元素优先级低 进栈 3
  • esp和ebp详解

    我的理解 国外一个比较好的汇编网站 http www tenouk com Bufferoverflowc Bufferoverflow1b html http blog sina com cn s blog c3bab4650101ogf
  • [指针五]指针做参数传递--使用详解

    void myMalloc char s 我想在函数中分配内存 再返回 s char malloc 100 void main char p NULL myMalloc p 这里的p实际还是NULL p的值没有改变 为什么 if p fre
  • 入门级题解71. 简化路径

    题目意思 翻译路径 题目给一个路径 你按规则翻译成另外的路径 split函数 https baike baidu com item split E5 87 BD E6 95 B0 6628136 C push方法与push back方法 1
  • linux驱动调试--段错误之栈信息分析

    转自 http blog chinaunix net xmlrpc php r blog article uid 29401328 id 4923529 接着上一篇来分析一下Oops的栈 s3c2440平台 关于调试源码和整个Oops信息请
  • C++中用两个栈实现一个队列

    想要利用两个栈实现一个队列 首先我们需要搞清楚栈和队列的特性 栈是后进先出 是一个压栈的过程 而队列则是先进先出的一个过程 用两个栈去实现一个队列 该怎样做 首先假如我们有一组数据 7 5 9 2 然后我们需要一个栈 stack
  • 【数据结构】链栈的定义和基本操作

    链栈定义及各类操作 include
  • 如何将栈中的元素输出

    首先需要写一个出栈函数 得到栈顶的值 才能将其输出 bool Pop SqStack s ElemType e if s gt top 1 return false e s gt data s gt top s gt top return
  • JVM内存模型图解(包含堆栈方法区例子和图解)

    下图是完整的虚拟机模型 我们主要是了解三个 1 堆区 heap 存储的全部是对象 每个对象都包含一个与之对应的class的信息 jvm只有一个堆区 heap 被所有线程共享 堆中不存放基本类型和对象引用 只存放对象本身 2 栈区 stack
  • 栈之中缀表达式转后缀表达式

    题目描述 就是把我们平常写的运算表达式换成另外一种表达式 运算符前面两个数字执行相关操作 用图说明一下 比如3 2 gt 3 2 比如3 3 2 gt 3 3 2 再比如 3 3 2 2 3 gt 3 3 2 2 3 程序设计思路 特殊情况
  • 【Python学习笔记】Python中的heapq

    Python中的heapq 1 基本介绍 堆是非线性的树形的数据结构 有两种堆 大根堆与小根堆 大根堆 树中各个父节点的值总是大于或等于任何一个子节点的值 小根堆 树中各个父节点的值总是小于或等于任何一个子节点的值 我们一般使用二叉堆来实现
  • 栈的讲解及实现(图解+代码/C语言)

    今天为大家分享的是栈的模拟实现 本文主要讲解如何以数组的形式模拟实现 同时给出链表模拟实现栈的代码 目录 图解栈的结构 数组模拟栈的分步实现 创建并初始化 入栈 检测栈是否为空 出栈 获取栈顶元素 获取栈内有效元素个数 销毁栈 链表模拟实现
  • C++用两个栈实现队列

    1 基础 队列 先进先出 即插入数据在队尾进行 删除数据在队头进行 栈 后进先出 即插入与删除数据均在栈顶进行 2 思路 两个栈实现一个队列的思想 用pushStack栈作为push数据的栈 用popStack栈作为pop数据的栈 只要是对
  • 堆栈01--用两个栈实现队列

    堆栈01 用两个栈实现队列 jz05 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 用两个栈来实现一个队列 完成队列的Push和Pop操作 队列中的元素为int类型 测试用例 队列先进先出 输入 1 2 输出 1 2 解析

随机推荐

  • python按照指定字符或者长度 截取字符串

    1 截取指定位置字符串 Python字符串可以理解为一个数组 获取某一部分的可以使用 str beginIndex endPosition 其中str为需要截取的字符串 beginIndex为需要截取的第一个字符的下标 endPositio
  • Spark入门教程

    1 简介 Apache Spark是一个开源的分布式计算框架 旨在提供快速 通用 易用的数据处理和分析技术 它可以在集群中处理大规模数据 支持多种数据处理模式 如批处理 交互式查询 流处理等 Spark还提供了丰富的API 包括Scala
  • ACM主要赛考察内容

    1 时间复杂度 渐近时间复杂度的严格定义 NP问题 时间复杂度的分析方法 主定理 2 排序算法 平方排序算法的应用 Shell排序 快速排序 归并排序 时间复杂度下界 三种线性时间排序 外部排序 拓扑排序 3 数论 整除 集合论 关系 素数
  • 基于IdentityServer4 实现.NET Core的认证授权

    NET西安社区 博客园 首页 新随笔 联系 管理 基于IdentityServer4 实现 NET Core的认证授权 目录 IdentityServer4是什么 OpenID Connect 和 OAuth2 0是什么 Authentic
  • centos7 samba 离线安装_CentOS7安装配置Samba服务

    接到运营人员需要共享文件的需求 考虑到简单易用的原则 这里选用Samba来做文件共享服务 先介绍下Samba服务 Samba是SMB CIFS 网络协议的重新实现 它作为 NFS 的补充使得在 Linux 和 Windows 系统中进行文件
  • 【电路中的滤波器】1.一阶RC低通滤波器详解

    前言 本文旨在从硬件电路特性 动态系统建模分析 系统传递函数多方面结合的角度来详细总结一阶低通滤波器 目的是从本质上多角度的去解析RC滤波器的原理 帮助自己通过RC低通走入模电频率部分这一 玄学 内容 这将是一个专题 后续将会继续更新各种滤
  • 安装opencv低版本

    opencv安装包 下载站点 https mirrors tuna tsinghua edu cn pypi web simple opencv python 进入之后 会发现opencv python 3 4 1 15 cp36 cp36
  • 人工智能-统计机器学习-特征人脸方法(Eigenface)

    人脸识别之特征人脸方法是一种应用主成份分析来实现人脸图像降维的方法 其本质是用一种称为 特征人脸 eigenface 的特征向量按照线性组合形式来表达每一张原始人脸图像 进而实现人脸识别 由此可见 这一方法的关键之处在于如何得到特征人脸 算
  • 基于pytorch训练图像识别

    1 准备数据集 2 清洗图片 3 划分训练测试数据 4 训练模型 5 保存模型 6 使用模型预测 报错 OSError Unrecognized data stream contents when reading image file 稍微
  • python之导包(库的所在位置,导包原则)

    前言 一 导包 1 含义解释 2 库的所在位置 3 导入 4 导包原则 一 5 导包原则 二 总结 前言 记录一下导包的规则 一 导包 1 含义解释 1 python自带的 不需要安装 直接导入 2 第三方库 先安装 再导入 再使用 3 自
  • mongodb副本集链接报错问题com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a serv

    1 报错信息 Exception in thread main com mongodb MongoTimeoutException Timed out after 30000 ms while waiting for a server th
  • FFplay文档解读-18-音频过滤器三

    26 21 anequalizer 每个通道的高阶参数多频带均衡器 它接受以下参数 params 此选项字符串的格式为 cchn f cf w w g g t f 每个均衡器带由 分隔 均衡器 解释 chn 设置要应用均衡的通道编号 如果输
  • C规范编辑笔记(十一)

    往期文章 C规范编辑笔记 一 C规范编辑笔记 二 C规范编辑笔记 三 C规范编辑笔记 四 C规范编辑笔记 五 C规范编辑笔记 六 C规范编辑笔记 七 C规范编辑笔记 八 C规范编辑笔记 九 C规则编辑笔记 十 正文 因为太久没有更新了 今天
  • 14.Xaml ProgressBar控件 进度条控件

    1 运行效果 2 运行源码 a Xaml源码
  • js 页面卸载前的信息提示

    a href http www baidu com go a
  • 多任务

    多任务 1 多任务的概念 多任务的最大好处是充分利用CPU资源 提高程序的执行效率 多任务是指在同一时间内执行多个任务 例如 现在电脑安装的操作系统都是多任务操作系统 可以同时运行着多个软件 多任务的执行方式 并发 并行 是多个任务真正意义
  • 2022值得一试的顶级 React 组件库

    随着 2013 年的推出 React JS JavaScript 库开始在全球范围内获得广泛认可 开发人员需要将 React JS 用于各种应用程序 React JS 增长的关键和重要原因之一是 React 组件库的数组 开发人员使用这些易
  • 2021-07-29

    中英文首字母排序 public static void main String args 数组 中文首字母排序 Collator 类是用来执行区分语言环境的 String 比较的 这里选择使用CHINA 这里的CHINA是根据地域选择的 C
  • docker的安装与使用:常用命令

    1 常用命令 进入容器命令 不要 docker attach 容器ID 当多个窗口同时使用该命令进入该容器时 所有的窗口都会同步显示 如果有一个窗口阻塞了 那么其他窗口也无法再进行操作 使用 docker exec it 容器ID bin
  • Java虚拟机(JVM源码):JDK10对Java虚拟机运行时数据区的划分(详细图解)

    Java虚拟机运行时数据区 为什么要研究这个 因为JDK都已经发布到10了 必须要更新自己对Java虚拟机新的认识 一 运行时数据区的划分 1 1 官方划分 关于JDK10对运行时数据区的划分 在官方文档说的非常清楚 学习技术 一定要学会看