当前位置: 首页 > news >正文

JVM深入浅出(1)--- 虚拟机内存区域

1. 运行时数据区域

  • 虚拟机栈
  • 本地方法栈
  • 方法区
  • 程序计数器

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

image-20260213205521738

1.1 程序计数器

程序技术器是线程私有的,指向当前执行的字节码指令地址,字节码解释器通过改变程序计数器的值来实现分支,循环,跳转。也是运行时数据区唯一不会发生OutOfMemoryError的地方。

1.2 虚拟机栈

虚拟机栈也是线程私有的。虚拟机栈是由一个个的栈帧组成的。
虚拟机栈也是线程私有的。虚拟机栈是由一个个的栈帧组成的。

栈帧包括了

  • 局部变量表

    • 局部变量表中的数据存储是一个又一个的局部变量槽(slot),局部变量表储存了java虚拟机的基本数据类型(byte,boolean,short,int,long,float,double,char),对象引用(不是对象本身)和returnAddress(字节码指令的地址),其中8字节的double和long占用两个局部变量槽。
  • 操作数栈

  • 动态连接

  • 方法出口

  • ...

虚拟机栈中可能会发生OOM和stackoverflow两种error

  • 当栈的深度超过虚拟机允许的深度时 --- > StackOverflow
  • 当栈是能动态扩容,且扩容后申请不到足够的内存 --> OOM

1.3 本地方法栈

本地方法栈和虚拟机栈类似,区别在于虚拟机栈执行的是java方法,而本地方法栈则是虚拟机使用到的native方法。

同样,本地方法栈也会跟虚拟机栈一样的情况抛出 StackOverflow 和OomError

1.4 Java 堆

  • 首先,Java堆中的数据是所有线程共享的
  • 主要是用来存储对象实例的。
  • 当代垃圾收集器大多根据分代收集理论设计,所以在堆中经常可以看到eden区,新生代,老年代,From survivor,To survivor 等等。
  • 当内存不够存储对象时,会发生OOMerror。
  • 堆中可以分配多个TLAB(thread local allocate buffer),用于给单个线程分配对象,这也是一种处理多线程分配对象的手段(还有乐观锁CAS

1.5 方法区

方法区也是各个线程共用的,主要是存储一些类元信息,常量,静态变量...

在Java8之前,方法区被称为永久代,这是因为当时垃圾收集器的分代设计拓展到方法区。在JDK7 之前,运行时常量池,字符串常量池,这些都是放在方法区中的,但是之后被转移到了堆中。到了JDK8,就没有了永久代的概念,转而变成了元空间

这块的内存回收主要是类的卸载(难以出现)。

当方法区的空间不足以存储新的数据,则报出OOM error。

1.6 运行时常量池

运行时常量池是属于方法区的,但是在内存中他和字符串常量池一样,是放在堆中的。

class文件中有常量池,在class文件编译之后,符号引用,字面量等等会被放到运行时常量池中。不单单针对编译过程,在程序运行的过程中,产生的常量也可以放到常量池中 比如String.intern()

运行时常量池不单单存储符号引用,也会把符号引用翻译出的直接引用也存储到运行时常量池中。

当运行时常量池无法处理新的内存分配时候,同样会报OOM error ,这一点和方法区是一样的。

1.7 直接内存

直接内存不属于运行时数据区。 直接内存是针对NIO 类,NIO类可以使用native函数库分配堆外内存,然后通过堆中的DirectByteBuffer对象作为这块内存的引用来操作这块内存。

直接内存也同样存在OOM error问题,因为其收到本机内存大小影响(通常较难排查)。

http://www.jsqmd.com/news/596821/

相关文章:

  • 综合能源系统中的经济-碳协调:最优调度和灵敏度分析【IEEE33节点】(Matlab代码实现)
  • 015、预训练模型(BERT, GPT)原理与迁移学习:从调不通的Embedding层说起
  • 突破Windows 11性能瓶颈:Win11Debloat开源优化工具的革新方案
  • 告别千篇一律:5个实用场景解锁Mac微信增强插件WeChatExtension
  • STK实战:如何用AreaTarget和CoverageDefinition快速完成卫星覆盖分析(附金星场景配置技巧)
  • 如何免费在Windows上使用Joy-Con手柄玩PC游戏:完整解决方案指南
  • 【白皮书拆解②】身份确权赋能数据与交易的核心逻辑及技术架构
  • Seata 1.6.1 + Nacos配置避坑指南:Windows环境从安装到整合SpringBoot的完整链路
  • Pixel Aurora Engine惊艳图集:‘极光青+日光黄’主题100张配色规范作品
  • Transformer注意力机制的隐藏杀手:为什么必须用√d_k缩放点积,否则softmax直接崩盘
  • 解析2026年中能芯光发展前景,细聊其管理水平及川渝陕贵客户认可情况 - 工业推荐榜
  • 从零构建私有云存储:基于MinIO与Docker的实战部署指南
  • AudioSeal音频水印系统部署教程:Meta开源AI语音溯源方案一键启动
  • 用PyTorch复现线性回归:从理论到代码的保姆级拆解(附D2L数据集实战)
  • 文件路径操作
  • 5分钟搭建AI语音助手:小白也能轻松上手的py-xiaozhi实战指南
  • 3大核心价值+5种应用场景:番茄小说下载器开源工具全解析
  • RMBG-2.0入门必看:暗黑动漫UI交互+透明背景输出完整操作手册
  • 目录操作管理
  • Mermaid:代码驱动的图表绘制工具效率革命
  • 别只搭场景了!深入Prescan动力学模型:从“3D Simple”配置到Simulink信号联调避坑指南
  • OpenClaw学术利器:千问3.5-27B自动校对LaTeX公式与引用
  • AI不是“抢工作”这么简单:过去7天,岗位正在被重组
  • 如何为Unity游戏实现自动翻译:XUnity.AutoTranslator完整使用指南
  • OFA视觉语义蕴含(iic/ofa_visual-entailment_snli-ve_large_en)零基础入门指南
  • 5个实用技巧让你高效使用bypass-paywalls-chrome-clean突破付费内容限制
  • 文件搜索效率低下?FSearch让Linux文件定位速度提升10倍的技术实现与应用指南
  • RTC-8564NB实时时钟芯片驱动开发与低功耗设计指南
  • 工业场景实战:如何用OpenCV搞定无重叠视域的双相机标定与拼接
  • 戴森球计划FactoryBluePrints蓝图库:从新手到高手的终极工厂建设指南