爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      JVM内存模型

      首页 知识中心 存储 文章详情页

      JVM内存模型

      2023-05-31 08:43:18 阅读次数:458

      JVM,内存,虚拟机

      JVM 内存模型划分

      JVM内存模型

      JVM 运算时数据区详细介绍

      • 运行时数据区的作用:JVM 在运行写好的代码时,会使用到多块内存空间,不同的内存空间用来放不同的数据,然后配合我们写的代码流程,才能让我们的系统运行起来

      方法区(Method Area)

      • 在​​JDK1.8​​​ 之前称之为​​方法区​​
      • 主要是放从​​“.class”​​ 文件里加载进来的类,还会有一些类似常量池的东西放在这个区域里
      • ​​JDK1.8​​​ 以后,这块区域的名字改了,叫做​​“Metaspace”​​​,可以认为是​​“元数据空间”​​ 这样的意思
      • 方法区是被所有线程共享的内存区域,用来存储已被虚拟机加载的类信息、常量、静态变量、JIT(just in time,即时编译技术)编译后的代码等数据
      • 运行时常量池是方法区的一部分,用于存放编译期间生成的各种字面常量和符号引用
      • 通过反射获取到的类型、方法名、字段名称、访问修饰符等信息就是从方法区获取到的
      • 在使用到​​CGLib​​​ 对类进行增强时,增强的类越多,就需要越大的方法区类存储动态生成的​​Class​​​ 信息,当存放方法区数据的内存溢出时,会报​​OutOfMemoryError​​ 异常
      • 可以通过参数​​JVM​​​ 参数​​-XX:MetaspaceSize​​​ 和​​-XX:MaxMetaspaceSize​​​ 设置​​Metaspace​​ 的空间大小

      程序计数器(Program Counter Register)

      • 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器
      • 程序计数器就是用来记录当前执行的字节码指令的位置的,也就是记录目前执行到了哪一条字节码指令
      • 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令:分支、跳转、循环、异常处理、线程恢复等基础操作都会依赖这个计数器来完成
      • 每个线程都有独立的程序计数器,用来在线程切换后能恢复到正确的执行位置,各条线程之间的计数器互不影响,独立存储
      • 字节码执行引擎在执行代码时,会修改程序计数器的值
      • 它是一个​​“线程私有”​​ 的内存区域

      虚拟机栈(VM Stack)

      • Java 在执行代码时,是以线程的方式帮我们执行代码
      • 每一个线程都有自己的​​Java虚拟机栈​​,用来存放自己执行那些方法的局部变量
      • JVM 栈是线程私有的内存区域,它描述的是 java 方法执行的内存模型
      • 每个方法执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息
      • 每个方法从调用直至完成的过程,都对应着一个栈帧从入栈到出栈的过程
      • 每当一个方法执行完成时,该栈帧就会弹出栈帧的元素作为这个方法的返回值,并且清除这个栈帧

      本地方法栈( Native Method Stack)

      • 本地方法栈和虚拟机栈所发挥的作用是很相似的,它们之间的区别不过是虚拟机栈为虚拟机执行 Java 方法(字节码)服务
      • 本地方法栈则为虚拟机使用到的​​Native​​ 方法服务

      堆(Heap)

      • 对于大多数应用来说,Java 堆(Java Heap)是 Java 虚拟机所管理的内存中最大的一块
      • Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建
      • 此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存

      字节码结构

      • Class 文件是一组以​​8​​ 位字节为基础单位的二进制流

      CLass 结构

      • 无符号数:基本类型,u1,u2,u4,u4 分别代表一个字节、两个字节、四个字节、八个字节的无符号数
      • 多个无符号数或者其他表作为数据项构成的复合数据类型,习惯以​​_info​​ 结尾,整个 class 文件本质上就是一张表

      JVM内存模型

      Class 具体结构

      魔数

      • 每个 class 文件的头 4 个字节称为魔数
      • 它的唯一作用是确定这个文件是否为一个能被虚拟机接受的 Class 文件
      • 大部分文件存储标准都是通过魔数来进行身份验证的
      • 对 Class 文件来说魔数值为​​0xCAFEBABE​​

      JVM内存模型

      版本号

      • 在魔数之后的 4 个字节存储的是 class 文件的版本号
      • 前两个字节是次版本号,后两个是主版本号

      JVM内存模型

      常量池

      • 常量池可以理解为 class 文件中的资源仓库,它是 class 文件结构中与其他项目关联最多的数据类型

      常量池主要存放两大类常量

      字面量

      • Java 语言的常量概念,final 修饰的关键字,字符串等等

      符号引用

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

      访问标志

      • 常量池之后是​​access_flags​​
      • 这个标志用于识别一些类或者接口层次的访问信息
      • 例如这个 class 是类还是接口,是 public 还是 abstract 等等
      • flags:(0x0021) ACC_PUBLIC,ACC_SUPER

      类索引、父类索引、接口索引集合

      • 类索引和父类索引各自指向一个类型为​​CONSTANT_Class_info​​ 的类描述符常量
      • 通过这个类描述符常量中的索引值可以找到定义在​​CONSTANT_Utf8_info​​ 类型的常量中的全限定名字符串

      字段表集合

      • ​​field_info​​ 用于描述接口或者类中声明的变量
      • 字段包括类级变量以及实例级变量,不包括方法中的临时变量
      • 字段表的结构用​​access_flags​​ 来表示作用域、是否 final、是否 static 等等

      方法表集合

      • 类似于字段表集合,由于方法没有​​volatile​​​ 和​​transient​​​ 关键字,因此​​access_flags​​​ 中没有​​ACC_VOLATILE​​​ 标志和​​ACC_TRANSIENT​​ 标志
      • 而增加了​​synchronized​​​、​​native​​ 等修饰方法的关键字

      栈帧

      局部变量表

      • 局部变量表是用来存储一组变量值的内存空间,用于存放方法参数和方法内部定义的局部变量
      • 在已经编译好的 Class 文件中,方法的 Code 属性的​​max_locals​​ 数据项中,就确定了该方法所需分配的局部变量表的最大容量

      变量槽(Variable Slot)

      • 局部变量表的容量以变量槽(Variable Slot)为最小单位
      • 每个变量槽存放一个 32 位数据类型
      • 如 boolean、byte、char、short、int、float 和 reference 这几种类型

      reference

      • reference 类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针
      • reference 类型表示对一个对象实例的引用
      • 通过这个引用做到两件事情:根据引用直接或间接地查找到实例在 Java 堆中的数据存放的起始地或索引
      • 根据引用直接或间接地查找到在方法区中的存储的类信息

      当一个方法被调用时,会使用局部变量表来完成参数值到参数变量列表的传递过程。如果执行的是对象实例的成员方法,那么局部变量表中第 0 位索引的变量槽默认就是该对象实例的引用,其余参数则按照参数表顺序排列,参数表分配完毕后,再根据方法体内部定义的局部变量顺序和作用域分配其余的变量槽。

      操作数栈

      • 操作数栈是一个后入先出(Last In First Out,LIFO)栈。和局部变量表一样
      • 在已经编译好的 Class 文件中,方法的 Code 属性的​​max_stacks​​ 数据项中,就确定了该方法所需分配的操作数栈的最大深度
      • 在方法执行的任何时候,操作数栈的深度都不会超过在​​max_stacks​​ 数据项中设定的最大值
      • 当一个方法刚刚开始执行的时候,该方法的操作数栈是空的
      • 在该方法的执行过程中,会有各种字节码指令对操作数栈进行出栈和入栈的操作
      • 比如,整数加法的字节码指令​​iadd​​,在该指令执行前必须保证操作数栈中最接近栈顶的两个元素已经存入了两个 int 型的数值
      • 当该指令执行时,会把这两个 int 值出栈并相加,然后将相加的结果重新入栈

      动态链接

      • 每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用
      • 包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接 (Dynamic Linking)比如:​​invokedynamic​​ 指令
      • 不是所有方法调用都需要动态链接的,有一部分符号引用会在类加载解析阶段
      • 比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的
      • 那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用

      方法出口

      • 当一个方法执行完毕之后,要返回之前调用它的地方,因此在栈帧中必须保存一个方法返回地址

      当一个方法开始执行时,可能有两种方式退出该方法

      • 正常完成出口
      • 异常完成出口

      一般来说,方法正常退出时,调用者的 PC 计数值可以作为返回地址,栈帧中可能保存此计数值。而方法异常退出时,返回地址是通过异常处理器表确定的,栈帧中一般不会保存此部分信息。

      栈帧调用流程详细分析

      JVM内存模型

      堆内存结构

      • 堆是 Java 虚拟机所管理的内存中最大的一块存储区域。​​堆内存被所有线程共享​​
      • 主要存放使用​​new​​ 关键字创建的对象。所有对象实例以及数组都要在堆上分配
      • 垃圾收集器就是根据 GC 算法,收集堆上对象所占用的内存空间

      Java 堆

      年轻代(Young Generation)

      • 年轻代又分为伊甸园(Eden)

      幸存区(Survivor区)

      幸存区又分为 From Survivor 空间,To Survivor 空间,年轻代存储 ​​“新生对象”​​​,我们新创建的对象存储在年轻代中。当年轻内存占满后,会触发 ​​Minor GC​​,清理年轻代内存空间。

      老年代(Old Generation)

      老年代存储长期存活的对象和大对象,年轻代中存储的对象,经过多次 GC 后仍然存活的对象会移动到老年代中进行存储,老年代空间占满后,会触发 ​​Full GC​​​,Full GC 是清理整个堆空间,包括年轻代和老年代。如果 Full GC 之后,堆中仍然无法存储对象,就会抛出 ​​OutOfMemoryError​​ 异常。

      JVM内存模型

      GC 过程

       

      • 当发出一个​​Minor GC​​​ 时,垃圾回收器就会对​​Eden​​ 区的内容进行回收
      • 如果某一个对象没有被任何指针引用,刚会被清理如果对象有指针引着,就会把该对象移到幸存区​​s0​​​ 并且对该对象的分代年龄​​+1​​
      • 再一次再发出​​Minor GC​​​ 时,会同时对​​Eden​​​ 区和​​S0​​​ 区进行回收,没有被回收的对象,全部转移到​​s1​​​ 区,对象的分代年龄​​+1​​
      • 再下一次时,同时对​​Eden​​​ 区和​​s1​​​ 区进行回收,没有被回收的对象,会被转移到​​s0​​​ 区,对象分代年龄​​+1​​
      • 当对象的分代年龄到达​​15​​ 时,就会把该对象转移到老年代
      • 当老年代中的内容存满时,就会触发​​full GC​​​,​​清理所有的内容​​
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/u_15652665/5330119,作者:qq628b229e2808e,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:(Nosql)列式存储是什么?

      下一篇:Confluence 7 如何修改启动内存

      相关文章

      2025-05-14 10:33:31

      计算机小白的成长历程——数组(1)

      计算机小白的成长历程——数组(1)

      2025-05-14 10:33:31
      strlen , 个数 , 元素 , 内存 , 十六进制 , 地址 , 数组
      2025-05-14 10:33:25

      超级好用的C++实用库之环形内存池

      环形内存池是一种高效的内存管理技术,特别适合于高并发、实时性要求高的系统中,比如:网络服务器、游戏引擎、实时音视频等领域。

      2025-05-14 10:33:25
      buffer , CHP , 内存 , 分配 , 加锁
      2025-05-14 10:07:38

      30天拿下Rust之所有权

      在编程语言的世界中,Rust凭借其独特的所有权机制脱颖而出,为开发者提供了一种新颖而强大的工具来防止内存错误。这一特性不仅确保了代码的安全性,还极大地提升了程序的性能。

      2025-05-14 10:07:38
      data , Rust , 内存 , 函数 , 变量 , 数据
      2025-05-14 10:03:13

      arm架构下JAVA开发

      ARM(Advanced RISC Machine)是一种基于精简指令集计算(RISC)设计的处理器架构。它以高效、节能著称,因此广泛应用 于从智能手机到物联网设备的各个领域。

      2025-05-14 10:03:13
      Java , JVM , 嵌入式 , 架构 , 设备
      2025-05-14 10:02:58

      Linux top 命令使用教程

      Linux top 是一个在Linux和其他类Unix 系统上常用的实时系统监控工具。它提供了一个动态的、交互式的实时视图,显示系统的整体性能信息以及正在运行的进程的相关信息。

      2025-05-14 10:02:58
      CPU , 信息 , 内存 , 占用 , 备注 , 进程
      2025-05-14 10:02:48

      使用JavaScript打印网页占用内存:详细指南

      在前端开发中,了解网页的内存占用情况对于优化性能和提高用户体验至关重要。

      2025-05-14 10:02:48
      JavaScript , 内存 , 占用 , 泄漏 , 浏览器 , 监听器 , 示例
      2025-05-14 09:51:15

      java循环创建对象内存溢出怎么解决

      在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError)。

      2025-05-14 09:51:15
      内存 , 占用 , 对象 , 引用 , 循环 , 次数 , 溢出
      2025-05-13 09:53:13

      计算机萌新的成长历程18——指针

      计算机要存储数据的话有以下几种途径,按访问速度由快到慢来排列分别是:寄存器>高速缓存>内存>硬盘。它们的存储空间大小是依次增大的,寄存器的存储空间大小最小,硬盘存储空间大小最大。

      2025-05-13 09:53:13
      内存 , 变量 , 地址 , 寄存器 , 指针
      2025-05-08 09:03:57

      m3db调优踩坑问题总结

      m3db调优踩坑问题总结

      2025-05-08 09:03:57
      内存 , 查询 , 聚合
      2025-05-07 09:12:52

      Java之IO流

      Java之IO流

      2025-05-07 09:12:52
      File , 内存 , 数据 , 文件 , 硬盘 , 程序 , 管道
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5223883

      查看更多

      最新文章

      30天拿下Rust之所有权

      2025-05-14 10:07:38

      Linux top 命令使用教程

      2025-05-14 10:02:58

      java循环创建对象内存溢出怎么解决

      2025-05-14 09:51:15

      m3db调优踩坑问题总结

      2025-05-08 09:03:57

      Redis多级缓存指南:从前端到后端全方位优化!

      2025-04-15 09:24:56

      php phpexcel导文件爆500(爆内存) && 应对

      2025-03-31 08:57:48

      查看更多

      热门文章

      获取服务器CPU、内存等各类信息工具类

      2023-04-27 08:00:25

      linux的存储管理

      2023-03-14 11:10:02

      libcurl第十二课 内存分析

      2023-03-15 09:25:34

      JS 变量、作用域与内存

      2023-05-19 03:35:34

      Confluence 7 如何修改启动内存

      2023-05-31 08:47:59

      【Elasticsearch6】安装笔记

      2024-09-25 10:14:34

      查看更多

      热门标签

      存储 缓存 内存 数据库 数据 redis mysql 服务器 数据恢复 Redis linux java 链表 MySQL sql
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      深入理解Linux内核(2)---内存寻址

      JVM系列一:JVM内存组成及分配

      oracle内存碎片

      Android App界面和流畅度优化

      文件操作-大文件的操作

      【内存池】讨论为什么 要自己实现内存池

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号