运行时数据区

1. 程序计数器

程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器

  • 为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器。各条线程之间的计数器互不影响,独立存储,即线程私有
  • 如果线程执行的是一个Java方法,计数器记录的是正在执行的虚拟机字节码指令的地址
  • 如果线程执行的是一个本地方法,计数器的值为空
  • 程序计数器是唯一一个没有规定OutOfMemoryError情况的区域

2. Java虚拟机栈

虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息

  • 虚拟机栈是线程私有的,它的生命周期和线程相同

  • 局部变量表中存放了编译器可知的各种Java虚拟机基本数据类型、对象引用、returnAddress类型【指向一条字节码指令的地址】

  • 这些数据类型在局部变量表中的存储空间以局部变量槽(slot)来表示,64位长度的long和double类型的数据占用两个变量槽,其余数据类型只占用一个。

  • 局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小【大小指的是变量槽的数量】。

3. 本地方法栈

本地方法栈发挥的作用与虚拟机栈类似,本地方法栈为虚拟机使用到的本地方法服务。

4. Java堆

堆是虚拟机管理的最大的内存,被所有线程所共享,在虚拟机启动时创建。

  • 从分配内存的角度看,所有线程共享的Java堆中可以划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB),以提升效率
  • Java堆可以处于物理上不连续的内存空间中,但是逻辑上应该被视为连续的
  • Java堆可以实现固定大小的,也可以是可扩展的(通过参数-Xmx和-Xms设定)

5. 方法区

方法区用于存储已经被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据

  • 方法区与Java堆一样不需要连续的内存,并且可以选择固定大小或者可扩展
  • 方法区的内存回收目标主要针对常量池的回收和对类型的卸载
posted @   Cedrus  阅读(46)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示