运行时数据区域

JVM:一、运行时数据区域 概述 Java的虚拟机使Java的成为了一种跨平台的语言,Java的不直接与操作系统接触,而是通过虚拟机这个中间桥梁,通过JVM与底层接触。不同的系统有不同的JVM,但是所有的这些JVM都完美的支持Java语法,这就使得write once,run everywhere成为可能。 除此之外,JVM的内存管理机制使得不需要再为每一个新的操作去删除/免费代码,由机器代替程序员这样就... 阅读详情

java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途及创建和销毁时间,有的随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。

这里有个图

其中方法区和堆,是所有线程共享的。虚拟机栈、本地方法栈和程序计数器由线程独享的。


  1. 程序计数器

程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器。

在任意时刻,一条Java虚拟机线程只会执行一个方法的代码,这个正在被线程执行的方法称为该线程的当前方法。如果这个方法不是 native 的,那 PC 寄存器就保存 Java 虚拟机正在执行的 字节码指令的地址,如果该方法是 native 的,那 PC 寄存器的值是 undefined。

该区域是唯一不会抛出OutOfMemoryError的区域。

2. java虚拟机栈

每一条 Java 虚拟机线程都有自己私有的 Java 虚拟机栈(Java Virtual Machine Stack) ,这个栈与线程同时创建,用于存储栈帧。每个方法被执行的时候都会同时创建一个栈帧,用于存储局部变量表、操作数栈、动态连接、方法出口等信息。方法的调用和结束对应着一个栈帧的入栈和出栈。java虚拟机栈在内存上可以是不连续的。

局部变量表存放了编译期可知的各种基本数据类型、对象引用和returnAddress类型。其中64位长的long和double会占据2个局部变量空间(slot)。每个栈帧内的局部变量表的空间大小在创建的时候就已确定,在消亡前不会再发生变化。

但是java虚拟机栈可以是固定的也可以是动态扩展、收缩的。

3.本地方法栈

Java虚拟机实现可能会使用到传统的栈(通常称之为“C Stacks”)来支持native方法 (指使用 Java 以外的其他语言编写的方法)的执行,这个栈就是本地方法栈。

当 Java 虚拟机使用其他语言(例如 C 语言)来实现指令集解释器时,也会使用到本地 方法栈。如果 Java 虚拟机不支持 native 方法,并且自己也不依赖传统栈的话,可以无需支持本 地方法栈,如果支持本地方法栈,那这个栈一般会在线程创建的时候按线程分配。

4.堆

在 Java 虚拟机中,堆(Heap)是可供各条线程共享的运行时内存区域,也是供所有类实例 和数组对象分配内存的区域。

Java虚拟机启动的时候就被创建,它存储了被自动内存管理系统(Automatic Storage Management System,也即是常说的“Garbage Collector(垃圾收集器)”)所管理的各种对象,这些受管理的对象无需,也无法显式地被销毁。

Java 虚拟机并未假设采用什么具体的技术去实现自动内存管理系统。虚拟机实现者可以根据系统的实际需要来选择自动内 存管理技术。

Java 堆的容量可以是固定大小的,也可以随着程序执行的需求动态扩展,并在不需 要过多空间时自动收缩。Java 堆所使用的内存不需要保证是连续的。

5.方法区

可以被多个线程在运行时共享的内存区域。用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

方法区在虚拟机启动的时候被创建,虽然方法区是堆的逻辑组成部分,但是简单的虚拟机实现 可以选择在这个区域不实现垃圾收集。方法区的容量可以是固定大小的,也可以随着程序执行的需求动态扩展, 并在不需要过多空间时自动收缩。方法区在实际内存空间中可以是不连续的。

6.运行时常量池

运行时常量池是方法区的一部分。是每一个类或接口的常量池的运行时表示形式,它包括了若干种不同的常量:从编译期可知的数值字面量到必须运行期解析后才能获得的方法或字段引用。运行时常量池扮演了类似传统语言中符号表(Symbol Table)的角色,不过它存储数据范围比通常意义上的符号表要更为广泛。

每一个运行时常量池都分配在 Java 虚拟机的方法区之中,在类和接口被加载到 虚拟机后,对应的运行时常量池就被创建出来。

7.栈帧

栈帧(Frame)是用来存储数据和部分过程结果的数据结构,同时也被用来处理动态链接 (Dynamic Linking)、方法返回值和异常分派(Dispatch Exception)。

栈帧随着方法调用而创建,随着方法结束而销毁——无论方法是正常完成还是异常完成(抛出 了在方法内未被捕获的异常)都算作方法结束。栈帧的存储空间分配在 Java 虚拟机栈之中,每一个栈帧都有自己的局部变量表(Local Variables)、操作数栈(Operand Stack)和指向当前方法所属的类的运行时常量池的引用。

在一条线程之中,只有目前正在执行的那个方法的栈帧是活动的。这个栈帧就被称为是当前栈 帧(Current Frame),这个栈帧对应的方法就被称为是当前方法(Current Method),定义 这个方法的类就称作当前类(Current Class)。对局部变量表和操作数栈的各种操作,通常都 指的是对当前栈帧的对局部变量表和操作数栈进行的操作。

栈帧是线程本地私有的数据,不可能在一个栈帧之中引用另外一条线程的栈帧。

1)局部变量表

栈帧中局部变量表的长度由编译期决定,并且存储于类和接口的二进制表示之中,既通过方法的 Code 属性保存及提供给栈帧使用。

局部变量使用索引来进行定位访问,第一个局部变量的索引值为零,局部变量的索引值是从零 至小于局部变量表最大容量的所有整数。

Java 虚拟机使用局部变量表来完成方法调用时的参数传递,当一个方法被调用的时候,它的 参数将会传递至从 0 开始的连续的局部变量表位置上。特别地,当一个实例方法被调用的时候, 第 0 个局部变量一定是用来存储被调用的实例方法所在的对象的引用(即 Java 语言中的“this” 关键字)。后续的其他参数将会传递至从 1 开始的连续的局部变量表位置上。

2)操作数栈

操作数栈为后进先出型栈。操作数栈所属的栈帧在刚刚被创建的时候,操作数栈是空的。Java 虚拟机提供一些字节码指 令来从局部变量表或者对象实例的字段中复制常量或变量值到操作数栈中,也提供了一些指令用于 从操作数栈取走数据、操作数据和把操作结果重新入栈。在方法调用的时候,操作数栈也用来准备 调用方法的参数以及接收方法返回结果。

在任意时刻,操作数栈都会有一个确定的栈深度,一个 long 或者 double 类型的数据会占用 两个单位的栈深度,其他数据类型则会占用一个单位深度。

3)动态连接

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

由于动态链接的存在,通过晚期绑定(Late Binding)使用的其他类的方法和变量在发生 变化时,将不会对调用它们的方法构成影响。



Allegro23.1新功能之软件自带阻抗计算工具操作指导 Allegro升级到了23.1后,软件新增了一个自带阻抗计算的功能,如下图。Propagation velocity:传输速度,单位是光速的多少倍。Dielectric constant输入介电常数,这里使用常规4。新功能之软件自带阻抗计算工具。如何使用,具体操作如下。 阅读详情

相关推荐

SECS/GEM协议中的关键指令详解:从S1F1到S9F9的完整指南

本文详细解析了SECS/GEM协议中从S1F1到S9F9的关键指令,涵盖设备状态管理、控制诊断、报警处理等核心功能。通过实际案例和调试技巧,帮助开发者掌握半导体制造设备通信标准,解决SECS/GEM协议在实际工程应用中的通讯难题,提升生产线智能化水平。

weixin_26899659的博客 397

【JVM】运行时数据区域

Java 虚拟机在执行 Java 程序时,会将管理的内存划分为若干个不同的数据区域。这些区域有着明确的职责分工,部分区域随线程创建而存在,随线程销毁而消失(线程私有),部分区域则被所有线程共享(线程共享)。值得注意的是,Java 虚拟机规范对这些区域的规定较为宽松。例如,堆可以是连续空间也可以是不连续空间,大小可以固定也可以动态扩展,垃圾回收算法也未做强制要求 —— 这为不同虚拟机实现提供了灵活度,但也要求开发者理解其共性设计。为什么 JDK1.8 移除永久代?永久代大小固定,易引发;

m0_61057201的博客 1514

MFC 利用soap 调用web service

MFC 利用soap 调用web service

congjiaoyan3682的博客 785

jvm运行时数据区域

https://www.programcreek.com/2013/04/jvm-run-time-data-areas/ 1.每个线程的数据区域(未共享) 每个线程的数据区域包括程序计数器寄存器、JVM堆栈和本机方法堆栈。它们都是在创建新线程时创建的。 程序计数器寄存器用于控制每个线程的每次执行。 JVM堆栈包含框架,如下图所示。 本机方法堆栈用于支持本机方法,即非Java语言方...

博客 434

用Unity Wheel Collider做坦克转向?3步实现履带式载具物理效果

本文详细解析了如何利用Unity的Wheel Collider组件实现履带式载具的差速转向物理效果。通过思维转换、场景搭建和核心代码实现三步,将Wheel Collider从模拟轮式车辆转向改造为控制履带扭矩差的系统,并深入探讨了参数调试与真实感提升的方法,帮助开发者打造物理反馈扎实的坦克或特种车辆模拟。

weixin_29009971的博客 223

【Claude Code】Not logged in 未登录错误解决方案 + /login 认证路径

Claude Code 启动时提示 Not logged in 表示当前会话缺少有效凭证。本文从环境变量、API Key 配置、CI 自动化凭证脚本和系统时钟四个维度,提供完整的认证排查流程与修复方案。

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 894

JVMの运行时数据区域

简述JVM的运行时数据区域划分及组件介绍

西岭千秋雪的博客 928

Xilinx DDR3 MIG IP核设计--汇总导航

快速上手Xilinx DDR3 IP核----汇总篇

孤独的单刀 2万+

JVM—运行时数据区域

目录 1.运行时数据区域概述 2.具体内容 2.1 线程独享的 2.2 线程共享的 1.运行时数据区域概述 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 这些区域 有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是 依赖用户线程的启动和结束而建立和销毁。 2.具体内容 Java虚拟机所管理的内存将会包括以下几个运行时数据区域 2.1 线程共享的数据区 2.1.1 方法区 2.1.2...

IAMZTDSF的博客 1434

C# Socket通信从入门到精通(14)——多个异步UDP客户端C#代码实现(史上最全)

本文详细介绍了Socket通信中多个异步Udp客户端功能的实现、介绍如何使用多个客户端与多个服务器进行数据的交互,包含连接服务器、断开服务器、发送数据、读取数据、C#代码实现,由高级工程师多年经验总结而成,绝对干货!

qq_34059233的博客 1982

BevFusion (5):逐行代码详解

论文中给出了Bevfusion的架构图,它的输入是多视角的相机和点云图,经过两个特定的head,分别用于做检测任务和分割任务。图1 Bevfusion 结构图Bevfusion因为有两个模态的输入:多视角相机和点云,所以对应两个分支:相机分支和点云分支。相机分支:输入6个视角的图片后,提取特征,然后经VT(View Transformer)转换之后得到相机的Bev特征。激光雷达分支:输入点云数据,经过Encoder编码得到体素化Lidar特征,然后沿z方向展平,得到Lidar Bev特征。

@bangbang的博客 3715

Java虚拟机——运行时数据区域

Java虚拟机——运行时数据区域,程序计数器,栈,堆,方法区,直接内存等

AIAIAIXIAO_的博客 1055

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JVM 运行时数据区域

JVM 运行时数据区域

m0_64616651的博客 795

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

JVM运行时数据区域

JVM——运行时数据区域 原文:Run-Time Data Areas Java虚拟机定义了在程序执行期间使用的多个运行时数据区域。其中一些数据区域是在Java虚拟机启动时创建的,只有当Java虚拟机退出时才会销毁。其他数据区域是每个线程私有的。线程私有的数据区域在线程创建时创建,在线程退出时销毁。 程序计数器 Java虚拟机可以同时支持多个线程执行。每个线程拥有自己的程序计数器。在任何时刻,...

叠甲的博客 221

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java虚拟机之运行时数据区域

等参数信息,但经常忽略掉直接内存,使得 各个内存区域总和大于物理内存限制(包括物理的和操作系统级的限制),从而导致动态扩展时出现 OutOfMemoryError异常。堆里面的 DirectByteBuffer对象作为这块内存的引用进行操作。分区或者分页文件)大小以及处理器寻址空间的限制,一般服务器管理员配置虚拟机参数时,会根据实际内存去设置-Xmx。堆大小的限制,但是,既然是内存,则肯定还是会受到。)并不是虚拟机运行时数据区的一部分,也不是《显然,本机直接内存的分配不会受到。唯一 一个不会oom的区域。

JouJz的博客 1113

Java虚拟机运行时数据区域

今天在读《深入理解Java虚拟机》,为了防止后续忘记,对所读的内容做一个简短的总结,主要的内容都是这本书上的。 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范(JavaSE7版)》的规定,Java虚拟机所管理的内存将包括以下几个运行时数据区域。...

Hanoch_wang的博客 384

【JVM】说一下jvm运行时数据区域

说一下jvm运行时数据区域 文章目录说一下jvm运行时数据区域程序计数器栈本地方法栈堆方法区运行时常量池直接内存 本篇文章总结自《深入理解Java虚拟机》 程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。 分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成 每个线程都有一个独立的程序计数器,各条线程之间计数器互补影响,独立存储,我们称这类内存区域为线程私有的内

GengMS的博客 566

Java运行时数据区域

Java运行时数据区域 文章目录Java运行时数据区域1.Java虚拟机运行时数据区图2.各个区域的解释2.1程序计数器2.2 Java虚拟机栈2.3本地方法栈2.4Java堆2.5方法区2.6 运行时常量池2.7 直接内存 1.Java虚拟机运行时数据区图 2.各个区域的解释 2.1程序计数器     程序计数器(Program Counter Register)是一块较小的内存空间,它可以看...

chenyogie 260

JVM 的运行时数据区域

原理: 方法区也称为永久代(PermGen),它是堆的一个逻辑部分,用于存储类的元数据,如类名、方法信息、字段信息等。原理: 本地方法栈用于支持本地方法的调用,与 JVM 栈类似,但它是为本地方法服务的。原理: 每个线程都有一个私有的 JVM 栈,用于存储线程的方法调用和局部变量。每次方法调用时,JVM 栈会分配一个栈帧,用于存储方法的局部变量表、操作数栈、动态链接、方法返回地址等信息。JVM 的运行时数据区域是 Java 虚拟机管理内存的主要区域,它主要包括堆、方法区、虚拟机栈、本地方法栈和程序计数器。

tzwwss的博客 526

JVM~基本命令、运行时数据区域

JVM在工作中是非常常用的,JVM调优更是尤为重要 JVM参数类型: 1)标准:稳定 2)X:相对变化较少的 3)XX:JVM调优 XX 又分为两种类型: a) boolean 类型的 -XX:[+/-] paramName +表示启动的状态 -:表示禁用的状态 -XX:+UseG1GC -XX:-UseG1GC jps ==> 查看pid jinfo -f...

Nice的博客 539

深入理解JVM之运行时数据区域

运行时数据区域包括程序计数器,java虚拟机栈,本地方法栈,方法区和堆。其中,java虚拟机栈,本地方法栈,程序计数器是每个线程私有的。 程序计数器 可以看作是当前线程执行到的字节码的行号指示器。对于Java的多线程,为了使程序每次切换后能够恢复到正确的执行位置,因此每一个线程必须要有自己独立的程序计数器。如果线程执行的是Java方法,记录的是正在执行的虚拟机字节码指令的地址(如果正在执行...

Gallon__的博客 263
上一篇: SQL优化
下一篇: 垃圾回收
weeweee
博客等级 码龄16年 10粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值