关于Java虚拟机运行时数据区域的总结

2023-11-03

Java虚拟机运行时数据区域

程序计数器(Program Counter)

程序计数器作为一个概念模型,这个是用来指示下一条需要执行的字节码指令在哪。

Java的多线程实际上是通过线程轮转做到的,如果是一个单核的机器(或单cpu),严格意义上在一个时间块中只会有一个线程在执行。为了线程切换以后能恢复到正确的执行位置,每个线程都需要有一个单独的计数器,每个计数器之间要是独立的互不干扰。

pc.jpg

如果线程执行的是Java方法,那么PC指向的是正在执行的虚拟机字节码指令的区域,如果执行的是native方法,那么它是undefined。

Java虚拟机栈

Java virtue machine也是线程私有的,它拥有一个和线程相同的生命周期

虚拟机栈描述的是Java方法执行的内存模型;stack frame(栈帧)是一个经常谈及的概念,它用来储存内部变量表,操作数栈,动态链接,方法出口等等。

每一个方法从调用到执行完毕,也就对应着一个栈帧在虚拟机栈中的入栈和出栈

我们以前画图来说明内存区的时候,总是去关注Heap(堆内存)和stack(栈内存)这两部分,这是与对象内存分配最相关的两块内存区。通常所说的stack就是虚拟机栈,或者更具体的说是虚拟机栈中的局部变量表。

局部变量表存放了编译器可知的各种基本数据类型(boolean byte double char int short long float)对象引用(reference类型,并不是对象本身,可能是地址的引用指针,也可能是一个代代表对象的句柄)return address类型(指向一条字节码指令的地址)

局部变量表的意义就在于,可以把表所需的内存在编译器就进行分配,每次程序去调用一个方法的时候,方法需要在frame中分配多少的局部内存空间是确定的。

两种异常情况

如果线程请求的栈的深度大于虚拟机所允许的,就是StackOverFlowError,如果是支持动态拓展的虚拟机(大部分的现代虚拟机都支持)依然无法申请到足够的内存,就会报出OutOfMemoryError异常。

本地方法栈

本地方法栈是和Java虚拟机栈对应的一个概念,它们的作用也是相近的,唯一的不同是,本地方法栈执行的是native方法,而Java虚拟机栈执行的是Java方法(也就是字节码)服务

在Sun的HotSpot虚拟机里面,本地方法栈和虚拟机栈是一个。

Java堆

堆是被所有的线程所共享的一块区域,这块内存区域存在的唯一目的就是存放对象实例,在虚拟机启动的时候就会被创建,几乎所有的对象实例都会在这里被分配内存

所有的对象实例和数组都要在堆上分配 --《Java虚拟机规范》

随着JIT编译器的发展和逃逸技术的成熟,这句话也变得不是那么的绝对了。

GC(garbage collection)也发生在这个区域,所以有时候也被称为GC堆

方法区

方法区和Java堆相似,是线程共享的一段内存区域,它用于储存已经被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码。

听起来好像和Java堆很像,Java虚拟机标准里面也把它视为堆的一个逻辑部分,但是它被称作Non-Heap,目的是和Java堆区分开来。

Permanent Generation?那么,这个方法区就是永久代吗,并不是。只是在HotSpot虚拟机的设计中,用永久代来实现了方法区。(在JDK1.7中,已经把原本放在永久代的字符串常量池移出了)

运行时常量池(Runtime Constant Pool)

这也是方法区的一个较重要的部分,.class文件除了有类的版本,字段,方法,接口等描述信息外,还有一部分是常量池,用于在存放编译期生成的各种字面量(Literal)和符号引用(Symbolic References),这部分的内容在类加载以后进入运行时常量池中存放。

字面量比较好理解,是Java语言层面的常量,例如文本字符串,声明为final的变量

符号引用这个我第一时间没看懂什么意思,其实是编译原理的一个概念,包括以下的三种常量:

  • 类和接口的全限定名
  • 字段名称和描述符
  • 方法名称和描述符

动态性,这是运行时常量池的一个重要的特性,在运行期间也可以将新的常量放进常量区(包括基本包装类和String,也可以调用intern()将String强制放进常量池)

为什么需要运行时常量池呢?

  • 更少的内存。直接赋值的时候会利用常量池里面的对象,而不是去new了一个

  • 更快的速度 。‘==’比equals()更快

Integer a = 23;//在编译的时候会变成Integer a = Integer.valueOf(23);使用的是线程池里面的对象

Integer b = new Integer(23);//创建了新的对象

ps.我感觉这个的设计思路和数据库连接池是差不多的,可以对照着去理解。

参考资料

《深入理解Java虚拟机》

转载于:https://www.cnblogs.com/QuixoteY/p/11346193.html

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

关于Java虚拟机运行时数据区域的总结 的相关文章

  • 我在使用 JavaFX 绘制十字时遇到问题

    我正在尝试编写代码 在网格上对角绘制 3 个形状 前两个形状是正方形和圆形 我能做到 然而 第三种形状让我有些悲伤 我应该画一个十字 T 版本 而不是 X 每次我写出代码时 它看起来就像一个侧面 我知道我只是错过了一些简单的东西 但我真的很
  • Android:对于具有 LinearLayout 定义的成员的 ListView,上下文菜单不显示?

    我有一个 ListActivity 和 ListView 并且我已将一些数据绑定到它 数据显示得很好 而且我还为视图注册了一个上下文菜单 当我将列表项显示为简单的 TextView 时 它工作正常
  • Spring安全+LocaleResolver

    我需要在身份验证成功后更改区域设置 区域设置解析器
  • Hibernate 每个子类一个表继承策略的效率

    我正在考虑 Hibernate 管理的类层次结构的表布局 当然 每个子类表技术在我看来是一般意义上最合适的 然而 通过逻辑思考 我对其性能有些担忧 尤其是随着子类数量的扩展 举一个非常简短 且经典 的示例 假设您有以下类 public ab
  • AMQP Spring 集成错误处理

    我的集成流程如下所示 Bean public IntegrationFlow auditFlow Qualifier eventLoggingConnectionFactory ConnectionFactory connectionFac
  • Android:TelephonyManager 类

    我不明白为什么 API 文档中这么写TelephonyManager类是public 但是当我尝试创建一个实例时 它说它不是公共类 并且无法从包中访问 我看到它也说使用Context getSystemService Context TEL
  • JTree ConvertValueToText 返回在更改时被截断

    我有一个自定义树实现convertValueToText 此实现取决于某些全局状态 如果返回的字符串比先前返回的字符串更长 实际上我认为更宽 因为以像素为单位触发它 则文本将被截断并用 填充 当重绘是由 取消 选择元素或某个元素引起时 情况
  • SSLContext 初始化

    我正在看JSSE参考指南 我需要获取一个实例SSLContext为了创建一个SSLEngine 所以我可以使用它Netty以启用安全性 获取实例SSLContext I use SSLContext getInstance 我看到该方法被重
  • 如何在java中从包含.0的浮点数中删除小数部分

    我只想删除包含的浮点数的小数部分 0 所有其他数字都是可以接受的 例如 I P 1 0 2 2 88 0 3 56666 4 1 45 00 99 560 O P 1 2 2 88 3 567 4 1 45 99 560 有什么方法可以做到
  • 不使用 length() 方法的字符串长度[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何在不使用字符串的情况下找到字符串的长度length String类的方法 str toCharArray length应该管用 或者怎么
  • java中永远不会出现的异常

    我为点和向量编写一个类 我想用它们来计算向量的点和范数 这些是点类和向量类 public class Point public float x y public class MyVector public Point start end 我
  • 使用 Haskell 将函数注入到 Java .class 文件中

    我使用 Haskell 编写了一个 Java 字节码解析器 它工作得很好 然而下一步让我完全难住了 我的 Haskell 程序需要修改 class 文件 以便在执行时 Java 程序打印 输入 此处的方法名称 在执行方法之前 并且 退出 此
  • Log4j 2.0 中发现 ClassNotFoundException

    我已经设置了 log4j12 api beta2 jar 的构建路径 但它给出了 以下错误请帮我解决这个问题我的代码如下 java 文件 package com sst log4j class Product private int pro
  • JavaFX Integer Spinner (IntegerSpinnerValueFactory) 不会将值回绕到最小值

    我创建了一个带有值的整数微调器 min 5 max 15 and initialValue 12 and wrapAround true 一旦旋转器到达max 15 增量期间的值 而不是将值重置为min 5 正如它所说文档 https op
  • Eclipse 如何创建一个未解决编译问题的类?

    当我尝试使用 javac 编译此类时 出现编译错误并且未创建 Test class public class Test public static void main String args int x 1L lt this cannot
  • 如何在 Hibernate 中自动递增复合主键中的 Id?

    我有一个带有复合主键的表 groupId and batchId 实体类看起来像 Entity name EMPLOYEE public class Employee EmbeddedId private EmployeePK employ
  • Android Webview:无法调用确定的可见性() - 从未见过 pid 的连接

    我有一个 Android Webview 当我单击链接下载文件 pdf 图像等 时 我收到一条错误消息 Error message Cannot call determinedVisibility never saw a connectio
  • java中什么是静态接口?

    我正在阅读Map Entry界面 当我注意到它是一个static界面 我不太明白什么是静态接口 它与常规接口有什么不同 public static interface Map Entry
  • Volley 在第一次调用方法时返回 null

    我正在尝试使用 volley 从服务器检索数据 但是当我第一次调用此方法时 我收到服务器的响应 但该方法返回 null 如果我第二次调用它 我会得到最后的响应 public String retrieveDataFromServer Str
  • 将 SQL 数据中的一行映射到 Java 对象

    我有一个 Java 类 其实例字段 以及匹配的 setter 方法 与 SQL 数据库表的列名相匹配 我想优雅地从表中获取一行 到 ResultSet 中 并将其映射到此类的实例 例如 我有一个 Student 类 其中包含实例字段 FNA

随机推荐

  • 记录一次Nginx转发请求给Ocelot网关响应500错误排查

    先说明下我们的Http请求流转及系统部署方式 当Http请求发起时 会先到达Nginx 然后Nignx会将请求转发至Ocelot网关服务 Ocelot网关服务会再将请求转发给下游真实提供API服务的应用 我们的应用是基于Net Core 3
  • 接口:mock 模拟数据以及接口调用遇到的 axios的坑

    项目用的 react dva 由于后端接口还没有好 所以需要用mock创数据 拦载 ajax 返回 mock 里面的数据 那么问题来了 怎么用 mock 呢 看了官方文档 我表示没有看明白 问团儿 这个问题 团儿解答 在你现在的里面写 ge
  • Maven项目连接&发布到Nexus私服

    前言 接上一篇 如果你本地还没有安装maven 那就 传送门 如果你还没有搭建Nexus环境 那就 传送门 环境 Windows7 x64 Eclipse Mars Nexus 2 14 5 02 apache maven 3 3 3 JD
  • VMWare虚拟机使用中且无法获取所有权解决措施

    一 事情起因 由于VMWare开启了过多虚拟机导致卡顿现象 动弹不得 关闭也显示 虚拟机正在繁忙 最后将其余靶机暂停并重启电脑 但是电脑是18年的 设备硬件些许落后 重启了很久 最后忍无可忍直接强制重启 重启后发现暂停的虚拟机开启不了了 一
  • MySQL 游标示例

    退出游标这个很难搞啊 查了半天 还是看原文档 CREATE DEFINER root localhost PROCEDURE LoopByLine BEGIN DECLARE MyStation char 20 DECLARE N int
  • 【Zabbix实战之运维篇】Zabbix监控平台的邮件报警配置

    Zabbix实战之运维篇 Zabbix监控平台的邮件报警配置 一 检查Zabbix监控平台状态 1 检查Zabbix各组件容器状态 2 检查Zabbix server状态 二 Zabbix的媒介管理配置 1 进入媒介管理界面 2 创建媒介类
  • 解决 元素隐式具有 “any“ 类型,因为类型为 “string“ 的表达式不能用于索引类型 “Object“。 在类型 “Object“ 上找不到具有类型为 “string“ 的参数的索引签名

    问题 元素隐式具有 any 类型 因为类型为 string 的表达式不能用于索引类型 Object 在类型 Object 上找不到具有类型为 string 的参数的索引签名 描述 在写代码的时候 对一个对象做了一个for in循环 然后取到
  • springboot+mysql租房管理平台-计算机毕业设计源码54739

    摘 要 2l世纪 随看全球经济的逢勃发展 众多经济字豕纷纷提出了新的管理理念 信息管理 强调了用信息支持决策 随着社会的发展 人们又提出了一个新的名词 管理信息系统 管理信息系统在强调信息的现代社会中变的越来越普及 它是一个利用计算机软硬件
  • Java软件编程开发:Mybatis和Url路由详细解析

    1 3 Mybatis MyBatis 本是apache的一个开源项目iBatis 2010年这个项目由apache software foundation 迁移到了google code 并且改名为MyBatis MyBatis是一个基于
  • 拉伸无锯齿的SVG图片

    package com moonlight example import com larvalabs svgandroid SVG import android content Context import android graphics
  • 电脑每次开机杀毒软件报iusb3mon.exe病毒已清除,电脑中病毒iusbmon杀毒办法,工具杀毒

    不知道什么时候开始 我电脑C盘的系统数据存储文件夹programdata 不知不觉就没了 找不到了 programdata文件夹为存储系统数据文件的 这个文件不见了 而且我打开了显示隐藏文件和文件夹还是没有显示 然后我重启电脑 杀毒软件报i
  • springboot 整合springmvc

    项目结构 引入web启动器 pom xml
  • ora-01536 超出表空间 'xxx' 的空间限额

    解决方案 1 alter user 你的用户名 quota 2g on 你建表的表空间的名字 有限制 2 alter user 你的用户名 quota unlimited on 你建表的表空间的名字 无限制 知识总结 表空间的大小与用户的配
  • 矩阵特征值与行列式、迹的关系

    矩阵特征值与行列式 迹的关系 from http www cnblogs com AndyJee p 3737592 html 矩阵的特征值之积等于矩阵的行列式 矩阵的特征值之和等于矩阵的迹 简单的理解证明如下 1 二次方程的韦达定理 请思
  • Python股票历史数据预处理(二)

    Python股票历史数据预处理 二 从网上下载的股票历史数据往往不能直接使用 需要转换为自己所需要的格式 下面以Python代码编程为工具 将csv文件中存储的股票历史数据提取出来并处理 处理的数据结果为是30天涨跌幅子数据库 下载地址为
  • 网桥、网关、网卡之间的区别

    如果要在全世界范围内把数以百万计的网络都互连起来 并且能够互相通信 那么这样的任务一定非常复杂 将网络互相连接起来要使用一些中间设备 物理层使用的中间设备叫转发器 数据链路层使用的中间设备叫做网桥 网络层使用的中间设备叫做路由器 在网络层以
  • 应用不能远程访问RabbitMQ的5672端口

    目录 1 背景 2 环境 3 步骤 1 添加用户 2 设置权限 3 停止服务 4 修改配置 5 启动rabbitmq的服务 6 应用配置 4 参考文档 1 背景 在使用SpringBoot开发的应用中 使用到RabbitMQ 需要通过567
  • 前端知识整理

    1 闭包 JS 中的闭包是什么 1 什么是闭包 函数和函数内部可以访问的变量组合一起就叫做闭包 闭包
  • 量化商品,计算相似度

    量化商品 计算相似度 如何精准寻找竞品 相似度算法 数据源及具体实现 思考与应用 如何精准寻找竞品 一般情况下 竞品的识别方式 是通过价格 规格 成分 主要宣传点 销量等维度进行判断的 然而这种方式存在一定滞后性 并且过于主观 同时没有监控
  • 关于Java虚拟机运行时数据区域的总结

    Java虚拟机运行时数据区域 程序计数器 Program Counter 程序计数器作为一个概念模型 这个是用来指示下一条需要执行的字节码指令在哪 Java的多线程实际上是通过线程轮转做到的 如果是一个单核的机器 或单cpu 严格意义上在一