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虚拟机运行时数据区的划分(详细图解) 的相关文章

  • SpringBoot项目优化和Jvm调优(楼主亲测,真实有效)

    项目调优 作为一名工程师 项目调优这事 是必须得熟练掌握的事情 在SpringBoot项目中 调优主要通过配置文件和配置JVM的参数的方式进行 在这边有一篇比较好的文章 推荐给大家 SpringBoot项目配置Tomcat和JVM参数 一
  • 逆序栈(递归⚠)

    给你一个栈 请逆序这个栈 不能申请额外的数据结构 只能使用递归求解 题解 这道题难点就在于无法申请额外数据结构 可以用两个递归函数实现 第一个递归函数GetBottom 主要用途是将栈底的数据出栈 并返回该数据的值 所以我们可以使用递归让栈
  • 利用栈来破解迷宫问题

    利用栈来破解迷宫问题 对于迷宫类问题的破解 需要利用栈的思想 1 构思 假设 当前位置 指的是在搜索过程中某一时刻所在途中某个方块的位置 路径是最优走法 则求迷宫当中一条路径的思想便是 若当前位置可以通过 那么存放在 路径 中 可以通过的位
  • 递归实现栈的翻转

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

    两个栈实现一个队列 要想实现此方法 我们现需要了解一下什么是栈和队列 栈 栈 Stack是一种只能在一端进行插入或删除操作的线性表 表中允许进行插入 删除操作的一端称为栈顶 Top 栈顶的当前位置是动态的 栈顶的当前位置是由一个称为栈顶指针
  • 3分钟弄清楚javascript的堆栈原理

    首先了解一下Javascript的堆栈概念 堆 栈 两者都是存放临时数据的地方 栈 stack 栈的特点是 LIFO 即后进先出 Last in first out 数据存储时只能从顶部逐个存入 取出时也需从顶部逐个取出 比如一个乒乓球的盒
  • stm32局部变量过大,导致栈溢出

    在做一个以stm32为主控的项目时发现自己程序中一个机构体里面的数据总是一运行就被改变 刚开始以为是自己不小心在哪个地方用了extern扩展了变量的作用域 重新赋了值 自己忘记了 后来查找了好久都没有其他地方使用这个结构体变量 于是开始单步
  • 栈(也被称作堆栈,一种遵循先进后出原则的数据结构)

    目录 1 栈 Stack 1 1 入栈 push 1 2 出栈 pop 1 3 栈的抽象数据类型 栈ADT 1 4 栈接口 2 利用数组实现栈 2 1 栈的实现 2 2 利用数组实现栈的优势与缺点 3 利用单链表实现栈 3 1 栈的实现 3
  • C++ stack容器-50-栈容器基本概念和常用接口

    接着学习下一个容器 stack 栈容器 当然后面还要学习一个队列容器 两个有点相似一般一起对比和学习 本篇主要学习栈容器的基本概念和常用接口的基本使用 1 什么是stack stack是一种先进后出 First In Last Out FI
  • 华为OD机试真题 Python,简单的解压缩算法,入栈出栈,队列

    def decoder s str gt str n len s A3B1 C 3 3 bracket pos stack 不是数字都入栈 def repeat stack pos num 弹栈次数 m len stack pos repe
  • 反汇编笔记

    1 OD中ctrl f9 运行到返回 就是运行到当前断点所在的函数末尾 retn xxx 处 若xxx 10 那么 10等于10进制的16 就是说这个函数有4个参数 一个参数默认是占4字节 所以就是retn 10 2 调试程序时 在OD内部
  • 剑指 Offer 09. 用两个栈实现队列

    题目链接 09 用两个栈实现队列 思路分析 用两个栈实现队列 首先把1 gt 2然后逐个弹出顶端元素 class CQueue public stack
  • 【C++编程基础】AOJ (C++ Programming II)—2-A-stack

    2 A stack 题目 stack Stack is a container of elements that are inserted and deleted according to LIFO Last In First Out Fo
  • 数据结构之 栈(C语言实现)

    数据结构之 栈 C语言实现 1 栈的模型 栈 stack 是限制插入和删除只能在一个位置上进行的表 该位置是表的末端 叫做栈的顶 top 对栈的基本操作有push 进栈 和pop 出栈 前者相当于插入 后者则是删除最后插入的元素 最后插入的
  • python中有堆吗?

    堆 英语 heap 是计算机科学中一类特殊的数据结构的统称 堆的定义 n个元素的序列 k1 k2 ki kn 当且仅当满足下关系时 称之为堆 推荐学习 Python基础视频教程 这是标准的堆的定义 但是python 中并没有独立的堆类型 只
  • 排序算法之堆排序(Heap Sort)——C语言实现

    堆排序 Heapsort 是指利用堆积树 堆 这种数据结构所设计的一种排序算法 它是选择排序的一种 算法分析 在学习堆排序之前我们要先了解堆这种数据结构 堆的定义如下 n个元素的序列 k1 k2 kn 当且满足以下关系时 称之为堆 若将此序
  • 数据结构:栈

    文章目录 栈 一 概述 二 添加数据 三 删除数据 栈 一 概述 栈 Stack 是一种特殊的线性表 它只允许在一端进行插入和删除操作 通常被称为 后进先出 Last In First Out LIFO 的数据结构 栈由一系列元素组成 每个
  • android判断一个Activity是否处于栈顶

    实际开发中我们需要很多情况需要判断某个activity是否位于栈顶 也许会给新的小伙伴带来困扰 那么直接上代码吧 也没几行 判断某activity是否处于栈顶 return true在栈顶 false不在栈顶 private boolean
  • 01 用栈实现队列(leecode 232)

    1 问题 请你仅使用两个栈实现先入先出队列 队列应当支持一般队列的支持的所有操作 push pop peek empty 实现 MyQueue 类 void push int x 将元素 x 推到队列的末尾 int 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对运行时数据区的划分 在官方文档说的非常清楚 学习技术 一定要学会看