Java运行时数据区域

Java运行时数据区域

[图]

 

程序计数器

  1. 行号指示器:字节码解释器工作时,会改变其中的值来选取下一条需要执行的字节码指令。分支、循环、异常处理都会依赖这部分数据。当线程未执行Java方法而是native方法时,这时存储的值为0。
  2. 线程私有:每个线程都有一块属于自己的程序计数器。

 

Java虚拟机栈

  1. 线程私有
  2. 描述方法的内存模型:每个方法在执行的同时都会创建一个栈桢用于存储局部变量表、操作数栈、动态链接、方法返回地址等信息。
  3. 异常:线程请求的栈深度大于虚拟机所允许的深度 – StackoverflowError  线程无法申请到足够内存 – OutOfMemoryError

     

    栈桢

      [图]

  1.  支持虚拟机进行方法调用与方法执行的数据结构。是Java虚拟机栈中的元素。
  2. 每一个方法从调用开始直到执行结束都对应着一个栈桢在虚拟机栈中从入栈到出栈的过程。
  3. 每个栈桢结构并非完全相互独立,虚拟机会对这部分进行优化,使得两个栈桢之间出现一些重叠,数据得以共享。

 

> 局部变量表

  1. 变量值存储空间:用于存放方法参数和方法内部的局部变量。
  2. 某一方法所需的局部变量表最大容量:在编译时即可确定,与方法运行时所需的空间无关。存储于方法的Code属性的max_locals数据项中。
  3. slot:局部变量表中最小的单位。VM中并未说明具体大小,但是32位类型的数据会占用1个slot,64位(double/long)会占用两个。

 

> 操作数栈

  1. 后入先出的栈结构。最大深度在编译时被存储在Code属性中的max_stack数据项中。
  2. 操作数栈中的每个元素可以是任意Java类型。32位占用1个栈容量,64位占用两个。
  3. 当方法刚开始执行的时候,这个方法的操作数栈永远为空,在执行的过程中,会有各种字节码指令往其写入/提取。

 

> 动态连接

  1. 指向运行时常量池中本栈桢所属方法的引用。

 

> 方法返回地址

  1. 正常完成出口:在运行结束中遇到一个方法返回的字节码指令。这时候可能会把返回值传递给调用者。这时调用者的程序计数器中的值就会作为返回地址。
  2. 异常返回出口:程序执行的过程中出现异常。这时方法不会给调用者任何返回着。而方法返回地址要通过异常处理器来确定,栈桢中并不包含这部分信息。
  3. 当方法退出就等同于把当前栈桢出栈。于是上层调用者的局部变量表和操作数栈会被恢复,并把返回值压入调用者栈桢的操作数栈中。

 

 

本地方法栈

与Java虚拟机栈相似,但本区域为虚拟机所需要的Native方法服务。

 

 

Java堆

  1. Java堆是被所有线程共享的一块内存区域。在虚拟机启动的时候就被创建,用于存放对象的实例。
  2. Java堆可以处于物理上不连续的内存空间中。可以通过-Xmx和-Xms扩展。
  • Java堆分区
  1. 堆分为新生代和老年代,JVM中定义他们所占空间的比值为2:1
  2. 新生区还可以分为Eden空间和Survivor空间, Survivor空间还可以分为from和to区域。Eden:from:to=8:1:1。
  3. JVM只会使用Eden空间和Survivor空间中的一块为对象服务,所以无论何时都会有一块区域未被使用。

 

 

方法区

  1. 方法区与Java堆一样,是公共共享的内存区域。用于存放一杯虚拟机加载的类信息、常量、静态变量等数据。
  2. 是Java堆的一个逻辑部分.

 

 

运行时常量区

  1. 方法区的一部分。用于存放编译时期生成的各种字面量和符号引用。同时也会把翻译出来的直接引用同时存在运行时常量池中。
  2. 具有动态性,在Java程序运行期间,也可以把新的常量放入池中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值