Java虚拟机运行时数据区域

  据《Java虚拟机规范(Java SE 7版)》规定,虚拟机所管理的内存包括以下几个运行时数据区域:
  
Java虚拟机运行时数据区域_第1张图片

  • 程序计数器
      可看作是当前线程所执行的字节码的行号指示器。虚拟机概念模型中,字节码解释器工作时就是通过改变计数器的值来选取下一条要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能均需要依赖这个计数器完成。
      由于在多线程并发环境下,每个线程都要有自己独自的计数器来保存相关执行位置。故该内存区域是“线程私有”的。
      如果线程执行的是Java方法,计数器记录的是正在执行的虚拟机字节码指令的地址。若执行的是Native方法,则计数器值为空(Undefined);
      
  • 虚拟机栈
      同计数器一样,该内存区域也是“线程私有”的。每个方法在执行的时候,都会创建一个栈帧,保存局部变量表,操作数栈,动态链接,方法出口等信息。方法的调用至运行结束退出,对应着其栈帧的入栈、出栈操作。我们常说的“栈”就是对应着该区域(或者说是虚拟机栈中的局部变量表部分)。
      虚拟机栈是否可扩展可由虚拟机自行设置。当线程请求的栈深度超过运行的最大深度,则会抛出StackOverflowError异常;若扩展时(虚拟机支持动态扩展)无法申请到足够内存则会抛出OutOfMemoryError异常。
      
  • 本地方法栈
      与虚拟机栈不同的是,虚拟机栈为执行Java方法服务,而本地方法栈为执行Native方法服务。虚拟机规范并未对本地方法栈中的方法使用的语言,使用方式和数据结构做强制规定。可由虚拟机自定义实现。如常用的HotSpot虚拟机就直接把虚拟机栈和本地方法栈合二为一了。
      
  • Java堆
      该区域是所有线程共享的。该区域为存放Java对象而存在,几乎所有对象实例均存放在该区域(逃逸分析技术等改变)。Java堆可以处在物理上不连续的内存空间中,只要逻辑上连续即可。当堆中没有内存供分配实例,并且也无法扩展(虚拟机支持动态扩展)时就会抛出OutOfMemoryError异常。
      
  • 方法区
      同Java堆一样,是线程共享的内存区域。用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。当方法区无法满足内存分配需求时,就会抛出OutOfMemoryError异常。

      附:Class文件中除了有类的版本、字段、方法、接口等信息外,还有一项信息是常量池,用于存放编译时产生的各种字面量和符号引用。这部分内容在类加载后在运行时常量池中存放(运行时常量池是方法区的一部分)。

      ^_^ 从现在开始要开始记一些Java虚拟机相关的内容了。

你可能感兴趣的:(java虚拟机)