Java运行时数据区域

运行时数据区域

程序计数器(与解释器配合工作)

程序计数器是一块较小的内存空间,可以看做是当前线程所执行字节码的行号显示器。
在Java虚拟机的概念模型中,字节码解释器工作就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,包括分支循环跳转异常处理等基本功能

  • 如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址
  • 如果线程正在执行的是一个本地(Native)方法,这个计数器的值则应该为空(Undefined)
  • 此内存区域永远不会出现OOM异常

Java虚拟机栈

  • 同程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期与线程数相同。
  • 虚拟机栈描述的是Java方法执行的线程内存模型:
    每个方法被执行的时候,Java虚拟机都会同步的创建一个栈桢用于存储局部变量表、操作数栈、动态链接、方法出口等信息
  • 调用方法对应入栈、方法结束对应出栈
局部变量表

局部变量表存放着编译期可知的各种Java虚拟机的数据类型

  • 基本数据类型(boolean、byte、char、short、int、float、long、double)
  • 对象引用(reference)
  • returnAddress类型(指向了一条字节码指令的地址)

局部变量表中以局部变量槽(Slot)来表示,其中除了64位也就是8个字节的long和double类型的数据会占用两个变量草,其余的数据类型只占用一个。
所需要的内存空间在编译期间完成分配,存放在Class文件的方法表的属性表的Code属性里面的u2类型的max_locals当中
当请求的栈深度大于栈最大深度时抛出StackOverflowError异常、当动态扩展无法获得更多内存时抛出OOM异常

本地方法栈

本地方法栈与虚拟机栈所发挥的作用类似,只不过是调用的本地(Native)方法

Java堆(线程共享、GC发生的主要场景)

Java几乎所有对象都是在堆空间中分配,但由于即时编译技术的进步,栈上分配、标量替换优化手段可能造成对象不会在堆中分配的特殊情况。
现代垃圾收集器大部分都是基于分代收集理论设计的,所以堆中可以分为“新生代”,“老年代”,“永久代”,“Eden空间”,“From Survivor空间”,“To Survivor空间”
虽然Java堆是线程共享的空间,但在分配内存的角度上看,所有线程共享的Java堆中仍然可以划分出多个线程私有的分配缓冲区(TLAB),以提升对象分配时的效率。
无论是分代还是缓冲区,其目的都是为了更好地回收Java堆中的垃圾回收,内存分配。
根据《Java虚拟机规范》的规定,Java堆可以处于物理上不连续的内存空间中,但在逻辑上他应该是被视为连续的

方法区

在JDK8之前为永久代、JDK8之后为元空间(本地空间)
用于存放被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据
此区域的内存回收目标主要是针对常量池的回收和对类型的卸载

运行时常量池

Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表(Constant Pool Table)用于存放编译期生成的各种字面量与符号引用(部分由符号引用翻译出来的直接引用也存储在运行时常量池中)、这部分内容是在类加载的第二步(Class文件静态存储转为方法区的运行时数据结构)之后存放到方法区的运行时常量池中的。
运行时常量池相对于Class文件常量池的最大的一个特点就是具备动态性、除了预置于Class文件中常量池的内容之外,还包括运行期间置入常量池中的常量。也就是说,运行时常量池中的常量一共有两个来源1.Class文件 2.运行期动态置入(如String类的intern()方法)

直接内存

直接内存并不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域,但是这部分内存也被频繁的使用,而且也可能导致OOM异常,比如JDK1.4中新加入的NIO类,是基于通道和缓冲区的IO方式,其可以通过Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这个空间的引用来进行操作,避免了Java堆和Native空间中的复制数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值