Java内存区域详解

news2024/9/25 9:31:06

一、Java内存区域划分

1、分为运行时数据区域和本地内存

  • 运行时数据区域是指 Java 虚拟机在运行 Java 程序时使用的不同内存区域,由虚拟机动态管理。
  • 本地内存是指由操作系统分配和管理的内存区域,它与虚拟机无关。在 Java 中,本地内存通常用于存储 JNI(Java Native Interface)方法调用时的数据以及本地方法库(Native Libraries)等内容。JNI 允许 Java 代码调用本地(非 Java)方法,而本地方法库是由 C、C++ 等语言编写的动态链接库,用于实现这些本地方法。本地内存的分配和释放由操作系统负责管理,而不受 Java 虚拟机的控制。

2、分为线程私有和共享

  • 线程私有的:①程序计数器②虚拟机栈③本地方法栈
  • 线程共享的:①堆②方法区③直接内存 (非运行时数据区的一部分)
  • 需要注意的是,在 JDK 1.8 之后,Java 虚拟机使用元空间(Metaspace)来代替永久代(Permanent Generation)来存储类的元数据。元空间不再位于堆中,而是位于本地内存(Native Memory)中。并且方法区(Method Area)也被替换为元空间(Metaspace)。
    下面来一一介绍。

在这里插入图片描述

二、各内存区域功能

1、程序计数器

线程私有的内存区域,每个线程都有一个程序计数器。
主要用于记录当前线程正在执行的字节码指令的地址或者正在执行的方法的当前行号。字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。
在线程切换时,程序计数器是不会发生线程间切换的,每个线程都会有独立的计数器记录执行位置。当线程被切换回来的时候能够知道该线程上次运行到哪儿了。
⚠️ 注意:程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束死亡。

2、虚拟机栈(Java Virtual Machine Stack):

线程私有的内存区域,每个线程都有自己的虚拟机栈。用于存储方法执行时的局部变量操作数栈动态链接方法出口等信息。方法调用的数据需要通过栈进行传递,每一次方法调用都会有一个对应的栈帧被压入栈中,方法调用结束后,栈帧被弹出。局部变量放在栈里面,形参属于局部变量。而成员变量随着类的创建而产生,放在堆里面。

  1. 局部变量表:主要存放了编译期可知的各种数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)。
  2. 操作数栈:主要作为方法调用的中转站使用,用于存放方法执行过程中产生的中间计算结果。另外,计算过程中产生的临时变量也会放在操作数栈中。
  3. 动态链接:主要服务一个方法需要调用其他方法的场景。Class 文件的常量池里保存有大量的符号引用比如方法引用的符号引用。当一个方法要调用其他方法,需要将常量池中指向方法的符号引用转化为其在内存地址中的直接引用。动态链接的作用就是为了将符号引用转换为调用方法的直接引用,这个过程也被称为 动态连接 。
  4. 方法出口:Java 方法有两种返回方式,一种是 return 语句正常返回,一种是抛出异常。不管哪种返回方式,都会导致栈帧被弹出。也就是说, 栈帧随着方法调用而创建,随着方法结束而销毁。无论方法正常完成还是异常完成都算作方法结束。

除了 StackOverFlowError 错误之外,栈还可能会出现OutOfMemoryError错误,这是因为如果栈的内存大小可以动态扩展, 如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。
在这里插入图片描述

3、本地方法栈(Native Method Stack):

类似于虚拟机栈,但是用于执行本地方法(Native Method)的线程私有内存区域。
存储本地方法的局部变量、操作数栈、动态链接等信息。

4、堆(Heap):

线程共享的内存区域,用于存储对象实例和数组等动态分配的内存,在虚拟机启动时创建。是 Java 虚拟机管理的最大的一块内存区域,也是垃圾回收的主要区域。

  • 字符串常量池:是 JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。HotSpot 虚拟机中字符串常量池保存的是字符串(key)和 字符串对象的引用(value)的映射关系,字符串对象的引用指向堆中的字符串对象。

5、方法区(Method Area)/ 元空间(Metaspace):

方法区是 JVM 运行时数据区域的一块逻辑区域,是各个线程共享的内存区域。方法区会存储已被虚拟机加载的 类信息、字段信息、方法信息、常量、静态变量、即时编译器编译后的代码缓存等数据。

  • 方法区和永久代以及元空间的关系? 方法区和永久代以及元空间的关系很像 Java 中接口和类的关系,类实现了接口,这里的类就可以看作是永久代和元空间,接口可以看作是方法区,也就是说永久代以及元空间是 HotSpot 虚拟机对虚拟机规范中方法区的两种实现方式。在 JDK 1.8 之前称为方法区,而在 JDK 1.8 及以后版本使用元空间代替了方法区。
  • 运行时常量池:Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有用于存放编译期生成的各种字面量(Literal)和符号引用(Symbolic Reference)的 常量池表(Constant Pool Table) 。

6、直接内存(Direct Memory):

直接内存是一种特殊的内存缓冲区,并不在 Java 堆或方法区中分配的,而是通过 JNI 的方式在本地内存上分配的。直接内存并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用。而且也可能导致 OutOfMemoryError 错误出现。用于提供在堆之外进行对象分配的一种方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1644643.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

生信网络学院|05月10日《全新DWG/DXF文件编辑工具——DraftSight Enterprise》

课程主题:全新DWG/DXF文件编辑工具——DraftSight Enterprise 课程时间:2024年05月10日 14:00-14:30 主讲人:任宇泽 生信科技 解决方案顾问 DraftSight介绍图形用户界面通用命令自定义块尺寸标注导入、导出和附加图纸集管理器Power Tools机…

大学生租房|基于Springboot+vue的大学生租房平台(源码+数据库+文档)

大学生租房平台 目录 基于Springbootvue的大学生租房平台 一、前言 二、系统设计 三、系统功能设计 1 管理员功能实现 5.1.1 房东管理 2 房东功能实现 5.2.1 信息审批管理 3 用户功能实现 5.3.1 房源信息 四、数据库设计 五、核心代码 六、论文参考 七、最新计…

半导体制冷片厂商正元泰达授权世强硬创代理,产品制冷率高寿命长

近日,为扩充旗下产品创新及供应平台世强硬创的半导体制冷片产品,满足硬科技企业不同层次的选择,世强先进(深圳)科技股份有限公司(下称“世强先进”)与正元泰达科技(深圳)…

PG 全页写

1.什么是全页写 修改一个块的时候,把块读到内存中,commit后,WAL写进程会触发写,把修改的块写到WAL日志文件,如果再往这个块中插入一条数据,数据缓冲区里面的块有两条数据了,再次commit后,PG会把…

最新AI实景自动无人直播软件招商加盟:引领直播行业的智能化未来;商家最新拓客工具

随着直播行业的迅速发展,AI实景自动无人直播软件正日益成为商家推广的新宠。该软件具备智能讲解、一键开播和智能回复功能,同时支持手机拍摄真实场景或自行搭建虚拟场景,给观众带来更好的观赏体验。在不断变化的市场竞争中,AI实景…

js浏览器请求,post请求中的参数形式和form-data提交数据时数据格式问题(2024-05-06)

浏览器几种常见的post请求方式 Content-Type 属性规定在发送到服务器之前应该如何对表单数据进行编码。 默认表单数据会编码为 "application/x-www-form-urlencoded" post请求的参数一般放在Body里。 Content-Type(内容类型),一般…

论文精读-存内计算芯片研究进展及应用

文章目录 论文精读-存内计算芯片研究进展及应用概述背景介绍前人工作 存内计算3.1 SRAM存内计算3.2 DRAM存内计算3.3 ReRAM/PCM存内计算3.4 MRAM存内计算3.5 NOR Flash存内计算3.6 基于其他介质的存内计算3.7 存内计算芯片应用场景 总结QA 论文精读-存内计算芯片研究进展及应用…

“A”分心得:我的云计算HCIE学习之路

大家好,我是誉天云计算HCIE周末班梁同学,在誉天老师和同学们的帮助下,我终于在4月24日顺利通过了云计算3.0 HCIE的认证考试,而且获得了A,这是让我特别惊喜的,功夫不负有心人。 我日常的工作是网络运维&…

Merck:mPAGE® Lux SDS-PAGE制胶系统

相对于传统SDS-PAGE制胶工艺,Merck公司的mPAGE Lux制胶系统是一种更快速、简单、安全的替代方法,可实现更具可重现性的结果。mPAGE Lux制胶系统可在90秒内完成小型凝胶固化,而传统方法则需要90分钟以上。该系统采用紫外线照射快速制胶工作流程…

Activity工作流基本知识点

1.概念 工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的…

java:File类概述和构造方法

一、File类概述和构造方法 1.File类的概述 File:它是文件和目录路径名的抽象表示 文件和目录是可以通过File封装成对象的对File而言,其封装并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。…

flink sql 优化

文章目录 一、参数方面二、资源方面三、总结 提示:实时flink sql 参考很多网上方法与自己实践方法汇总(版本:flink1.13) 一、参数方面 flink sql参数配置 //关闭详细算子链(默认为true),true后job性能会略微有提升。false则可以展示更详细的DAG图方便地位性能结点…

Xshell生成ssh密钥及使用

目录 1. 概述2. 环境3. 步骤3.1 生成密钥3.2 部署密钥3.3 使用密钥 1. 概述 使用Xshell软件生成ssh秘钥,正常连接服务器。 2. 环境 Xshell 6 3. 步骤 3.1 生成密钥 1. 打开Xshell --> 工具 --> 新建用户密钥生成向导 2. 选择密钥类型,建议…

如何更好的使用cpm

nvidia发布了RAFT库,支持向量数据库的底层计算优化,RAFT 也使用CMake Package Manager( CPM )和rapids-cmake管理项目,可以方便快捷的下载到需要的对应版本的thirdparty的依赖库,但是,一般情况下,项目是直接…

c++11 标准模板(STL)本地化库 - 平面类别(std::num_get) - 从输入字符序列中解析数字值

本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析&#xff0c;以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 平面类别 从输入字符序列中解析数字值 std::num_get template< cl…

【Python时序预测系列】粒子群算法(PSO)优化LSTM实现单变量时间序列预测(案例+源码)

这是我的第272篇原创文章。 一、引言 粒子群算法&#xff08;Particle Swarm Optimization, PSO&#xff09;是一种启发式优化算法&#xff0c;可以用于优化神经网络模型的参数。在优化长短期记忆网络&#xff08;Long Short-Term Memory, LSTM&#xff09;时&#xff0c;可以结…

JetPack之ViewModel+LiveData

目录 一、概述二、LiveData 使用2.1 创建 LiveData 对象2.2 观察 LiveData 对象2.3 更新 LiveData 对象 三、编写 LiveData Demo3.1 不使用 LiveData3.2 使用 MutableLiveData3.3 使用 MediatorLiveData3.3.1 监听 2 个数据源的变化3.3.2 编写模拟 2 个数据源更新的代码 四、Vi…

4月威胁态势 | 0day占比82%!Polyransom勒索家族强势来袭

近日&#xff0c;亚信安全正式发布《2024年4月威胁态势报告》&#xff08;以下简称“报告”&#xff09;&#xff0c;报告显示&#xff0c;4月份新增安全漏洞1260个&#xff0c;涉及0day漏洞占82%&#xff1b;监测发现当前较活跃的勒索病毒家族是Polyransom和Blocker&#xff0…

FIFO Generate IP核使用——Native接口时读写宽度不一致详解

表3-4显示了在选择了Native接口时哪些时钟类型支持非对称的宽高比&#xff0c;即读写宽度不一致。 非对称的宽高比允许FIFO的输入和输出宽度不同。FIFO支持以下写-读宽高比&#xff08;Write-to-Read Aspect Ratios&#xff09;&#xff1a;1:8, 1:4, 1:2, 1:1, 2:1, 4:1, 8:1…