JVM 基础 - JVM 内存结构

news2024/11/18 20:47:36

JVM 内存结构

  • 运行时数据区
  • 一、程序计数器(线程私有)
  • 二、虚拟机栈(线程私有)
  • 三、本地方法栈(线程私有)
  • 四、堆内存(线程共享)
  • 五、方法区(线程共享)

运行时数据区

内存是非常重要的系统资源,是硬盘和 CPU 的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM 内存布局规定了 Java 在运行过程中内存申请、分配、管理的策略,保证了 JVM 的高效稳定运行。不同的 JVM 对于内存的划分方式和管理机制存在着部分差异。下图是 JVM 整体架构,中间部分就是 Java 虚拟机定义的各种运行时数据区域。
在这里插入图片描述
Java 虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程一一对应的数据区域会随着线程开始和结束而创建和销毁。

线程私有:程序计数器、虚拟机栈、本地方法区
线程共享:堆、方法区,堆外内存(JDK 7的永久代或JDK 8的元空间、代码缓存)

一、程序计数器(线程私有)

PC 寄存器用来存储指向下一条指令的地址。由执行引擎读取下一条指令。

它是唯一一个在 JVM 规范中没有规定任何 OutOfMemoryError 情况的区域。

二、虚拟机栈(线程私有)

每个线程在创建的时候都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次 Java 方法调用,生命周期和线程一致。不存在垃圾回收问题。

作用:主管 Java 程序的运行,它保存方法的局部变量、部分结果,并参与方法的调用和返回。

栈中可能出现的异常:
JVM允许虚拟机栈的大小是动态的或者是固定不变的,因此可能会出现两种异常:
▲StackOverflowError
▲OutOfMemoryError

栈帧的内部结构:
在这里插入图片描述1、局部变量表:主要用于存储方法参数和定义在方法体内的局部变量。

  • 最基本的存储单元是Slot(变量槽),可以重用
  • 当一个实例方法被调用的时候,它的方法参数和方法体内部定义的局部变量将会按照顺序被复制到局部变量表中的每一个 Slot 上

局部变量表中的变量也是重要的垃圾回收根节点,只要被局部变量表中直接或间接引用的对象都不会被回收

2、操作数栈:主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。
我们说Java虚拟机的解释引擎是基于栈的执行引擎,其中的栈指的就是操作数栈。
HotSpot JVM 设计者们提出了栈顶缓存技术,将栈顶元素全部缓存在物理 CPU 的寄存器中,以此降低对内存的读/写次数,提升执行引擎的执行效率。

3、动态链接(指向运行时常量池的方法引用)
在这里插入图片描述

  • 每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用。包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接(Dynamic Linking)。
  • 在 Java 源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference)保存在 Class 文件的常量池中。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用

4、方法返回地址:用来存放调用该方法的 PC 寄存器的值。

5、附加信息:例如,对程序调试提供支持的信息,但这些信息取决于具体的虚拟机实现。

三、本地方法栈(线程私有)

本地方法栈和虚拟机栈所发挥的作用非常相似,区别是: 虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。

在 HotSpot 虚 拟机中和 Java 虚拟机栈合二为一。 所以,为了保证线程中的局部变量不被别的线程访问到,虚拟机栈和本地方法栈是线程私有 的。

和虚拟机栈一样,本地方法栈也可能会出现OOM和StackOverflowError这两种异常:

四、堆内存(线程共享)

对于大多数应用,Java 堆是 Java 虚拟机管理的内存中最大的一块,被所有线程共享。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数据都在这里分配内存

为了进行高效的垃圾回收,虚拟机把堆内存逻辑上划分成三块区域(分代的唯一理由就是优化 GC 性能):
在这里插入图片描述
1、年轻代 (Young Generation):
年轻代是所有新对象创建的地方。当填充年轻代时,执行垃圾收集。这种垃圾收集称为 Minor GC。年轻一代被分为三个部分——伊甸园(Eden Memory)和两个幸存区(Survivor Memory,被称为from/to 或 s0/s1),默认比例是8:1:1

2、老年代(Old Generation):
旧的一代内存包含那些经过许多轮小型 GC 后仍然存活的对象。通常,垃圾收集是在老年代内存满时执行的。老年代垃圾收集称为 主GC(Major GC),通常需要更长的时间。
大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。这样做的目的是避免在 Eden 区和两个Survivor 区之间发生大量的内存拷贝

3、元空间:
不管是 JDK8 之前的永久代,还是 JDK8 及以后的元空间,都可以看作是 Java 虚拟机规范中方法区的实现。虽然 Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫 Non-Heap(非堆),目的应该是与 Java 堆区分开。所以元空间放在后边的方法区再说。
在这里插入图片描述
分代收集理论
依据分代假说理论,垃圾回收可以分为如下几类:
1、新生代收集(Minor GC/Young GC):目标为新生代的垃圾收集。
2、老年代收集(Major GC/Old GC):目标为老年代的垃圾收集,目前只有CMS收集器会有这种行为。
3、混合收集(Mixed GC):目标为整个新生代及部分老年代的垃圾收集,目前只有G1收集器会有这种行为。
4、整堆收集(Full GC):目标为整个堆和方法区的垃圾收集。

五、方法区(线程共享)

方法区(method area)只是 JVM 规范中定义的一个概念,用于存储类信息、常量池、静态变量、JIT编译后的代码缓存等数据,并没有规定如何去实现它,不同的厂商有不同的实现。而永久代(PermGen)是 Hotspot 虚拟机特有的概念, Java8 的时候又被元空间取代了,永久代和元空间都可以理解为方法区的落地实现。

永久代物理是堆的一部分,和新生代,老年代地址是连续的(受垃圾回收器管理),而元空间存在于本地内存(我们常说的堆外内存,不受垃圾回收器管理),这样就不受 JVM 限制了,也比较难发生OOM(都会有溢出异常)
在这里插入图片描述
在JDK1.7字符串常量池和静态变量被从方法区拿到了堆中,运行时常量池剩下的还在方法区, 也就是HotSpot中的永久代。
在这里插入图片描述
在JDK8 HotSpot移除了永久代用元空间(Metaspace)取而代之, 这时候字符串常量池还在堆,运行时常量池还在方法区,只不过方法区的实现从永久代变成了元空间(Metaspace)
在这里插入图片描述

参考文章:
JVM 基础 - JVM 内存结构
JDK的运行时常量池、字符串常量池、静态常量池

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

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

相关文章

【Git笔记】分支操作与合并分支(正常与冲突)

分支的操作 命令名称作用git branch 分支名创建分支git branch -v查看分支git checkout 分支名切换分支git merge 分支名把指定的分支合并到当前分支上 查看分支 创建分支 切换分支 合并分支(正常合并) 在 master 下,hello.txt 在 hot-fix …

[Spring Boot]11 使用@Cacheable注解实现Redis缓存

前言 为了方便讲解,模拟一个需要使用Redis缓存的场景,比如:一款APP的首页,由于其需要加载的数据量较大,于是决定把首页的部分数据使用Redis进行缓存,举例:比如要缓存首页的文章列表(ArticleLis…

Cartesi 2023 年 1 月回顾

2023 年1月 31日,准备迎接令人兴奋的一年,你做好准备了吗? 本月我们围绕游戏领域开展了很多推广活动。主持了我们的第二次游戏开发者社区电话会议, Cartesi 大使 Zach和Ultrachess 开发者 Jesse在 ATX Game Makers 的 game jam 上…

34k*16 薪,3年自动化测试历经3轮面试成功拿下华为Offer....

前言 转眼过去,距离读书的时候已经这么久了吗?,从18年5月本科毕业入职了一家小公司,到现在快4年了,前段时间社招想着找一个新的工作,前前后后花了一个多月的时间复习以及面试,前几天拿到了华为…

background-attachment属性值scroll、fixed和local的区别

首先看菜鸟教程中的解释: scroll:背景图片随着页面的滚动而滚动,默认值 fixed:背景图片不会随着页面的滚动而滚动 local:背景图片会随着元素的内容滚动而滚动 代码结合实例说明 先看代码: 主要包含两个盒子…

MyBatis(二)MyBatis入门程序

一、版本 软件版本: IntelliJ IDEA:2022.1.4Navicat for MySQL:16.0.14MySQL数据库:8.0.30 组件版本: MySQL驱动:8.0.30MyBatis:3.5.10JDK:Java17JUnit:4.13.2Logback…

实景三维模型道路中有很多破损车辆,有没有可以一键修除或去掉的办法?

在超大规模实景三维数据生产中,三维模型质量会受到移动物体这类客观因素的影响,常常造成道路模型严重扭曲以及纹理的错位。 1.三维场景重建中的移动车辆问题 车辆作为日常出行重要的交通工具,会出现在城市场景中的各个角落且不断移动。由于…

【方案】契约锁电子签章在50多个行业的详细应用场景

2022年,契约锁电子签章持续深入政府机关、集团、高校、医院、金融、工程、汽车、能源、食品、检测等各行业中大型组织,在与各类管理软件集成应用中,不断丰富签署场景,实现了300多种业务文件电子签署应用,持续助力组织数…

数据结构与算法:优先级队列(堆)

1.优先级队列 1.定义 前面介绍过队列,队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出队列,该中场景下,使用队列显然不…

【Rust】16. 智能指针

智能指针&#xff08;smart pointers&#xff09;是一类数据结构&#xff0c;他们的表现类似指针&#xff0c;但是也拥有额外的元数据和功能引用是一类只借用数据的指针&#xff1b;相反&#xff0c;在大部分情况下&#xff0c;智能指针拥有他们指向的数据 16.1 Box<T>&a…

1610_PC汇编语言_整形的表达

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 前面对于汇编有了一个基本的了解&#xff0c;这一章节主要是看一下汇编视角下的数据表达以及计算方式。 1. 整形会有有符号和无符号两种&#xff0c;一般都是用最高…

快上车,程序狗好用的奇淫技巧

文章目录前言&#x1f34a;缘由⏲️本文阅读时长&#x1f3af;主要目标正文&#x1f9d9;‍♂️1.魔术橡皮擦&#x1f415;2.狗屁不通文章生成器&#x1f95e;3.easypdf&#x1f97d;4.Md2All&#x1f32e;5.CSDN开发助手&#x1f468;‍&#x1f4bb;6.猿如意&#x1f9e9;7.P…

Three.js 初阶基础篇(二)

系列文章目录 我今天又来了更新了&#xff01;&#xff01;&#xff01;今天主要还是回顾一下昨天的一内容&#xff0c;在昨天的基础上又重新梳理了一下&#xff0c;创建动态3D正方体的流程&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 文章目录…

VMware虚拟机安装Linux教程

一、centos7下载 1、centos7的下载 官网下载地址: https://www.centos.org/download/ 2、点击x86_64 二、虚拟机下载与安装 1、VMware虚拟机下载 官网地址: https://www.vmware.com/cn/products/workstation-player.html 打开下载好的.exe文件 安装位置默认在 C 盘下…

【JavaSE】运算符

运算符BIT-3 运算符1. 什么是运算符2. 算数运算符2.1 基本四则运算符2.2 增量运算符2.3 自增/自减运算符3. 关系运算符4. 逻辑运算符&#xff08;重点&#xff09;4.1 逻辑与&&4.2 逻辑或||4.3 逻辑非&#xff01;4.4 短路求值5. 位运算符5.1 按位与&5.2 按位或|5.…

【借助pf4j实现基于spring-boot的插件化开发

借助pf4j实现基于spring-boot的插件化开发背景场景项目地址&结构Demo运行背景 Jenkins、SonarQube等Java实现的Web应用都有插件体系&#xff0c;一般来说都是先从插件市场下载一个插件&#xff0c;然后系统要求重启(某些功能可以不用重启)&#xff0c;插件功能就能在页面上…

SRM-供应商管理系统搭建指南

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建SRM-供应商管理。1.2、应用场景供应商可注册、提交、修改自己的基本信息及工商信息&#xff0c;上传资质档案、管理产品及样品信息&#xff1b;企业对供应商是否成为合格供应商或淘汰供应商进行准入流程的审批。2、设置方法…

软件设计(四)--MTBF、MTTF、MTTR

软件设计&#xff08;三&#xff09;https://blog.csdn.net/ke1ying/article/details/128808681 31、结构化开发中&#xff0c;过程设计 主要包含对数据结构和算法的设计。 体系结构设计&#xff1a;定义软件的主要结构元素及其关系。 数据设计&#xff1a;基于实体联系图&a…

高压放大器在多波长干涉相位同步解调方法研究中的应用

实验名称&#xff1a;基于激光相位分立调制的多波长干涉相位同步解调方法研究 研究方向&#xff1a;激光测量 测试目的&#xff1a; 在长度测量中&#xff0c;绝对距离测量&#xff08;ADM&#xff09;可实现高精度、大范围和瞬时距离测量&#xff0c;与相对位移测量&#xff0…

Dynamsoft Barcode Reader 9.6.1 for NET Crack

Dynamsoft Barcode Reader以每分钟 500 的速度扫描条码 Dynamsoft Barcode Reader具有灵活 API 的强大条码扫描器 SDK Dynamsoft Barcode Reader无论它是模糊的、扭曲的、黑暗的、遥远的还是移动的&#xff0c;我们都可以扫描它。快速地。 业界最快扫描解码&#xff0c;适用于…