首页 > 技术文章 > Java虚拟机结构阅读摘要

qiyu 2013-10-01 19:30 原文

1.数据类型:

  Java虚拟机可操作的数据类型分为原始类型和引用类型

  原始类型包括数值类型(Numeric)、布尔类型(Boolean)和returnAddress类型:

  表示一条字节码指令的操作码(Opcode)。在所有的虚拟机支持的原始类型之中,只有returnAddress类型是不能直接Java语言的数据类型对应起来的。

  引用类型包括类类型、数组类型和接口类型,这些引用类型的值分别由类实例、数组实例和实现了某个接口的类实例或数组实例动态创建

2.运行时数据区

  Java虚拟机定义了很多种程序运行期间使用到的运行时数据区,其中一部分的生命周期与虚拟机一致,另外一部分则是与线程的生命周期对应。

2.1PC寄存器

  Java虚拟机可以支持多条线程同时执行,每一条Java虚拟机线程都有自己的PC(Program Counter)寄存器。在任意时刻,一条Java虚拟机线程只会执行一个  方法的代码,这个正在被线程执行的方法称为该线程的当前方法。如果这个方法不是native的,那PC寄存器就保存Java虚拟机正在执行的字节码指令的地址,如  果该方法是native的,那PC寄存器的值是undefined。

2.2Java虚拟机栈

  Java虚拟机规范允许Java虚拟机栈被实现成固定大小的或者是根据计算动态扩展和收缩的。

  对于可以动态扩展和收缩Java虚拟机栈来说,则应当提供调节其最大、最小容量的手段。
  Java虚拟机栈可能发生如下异常情况:
   如果线程请求分配的栈容量超过Java虚拟机栈允许的最大容量时,Java虚拟机将会抛出一个StackOverflowError异常。
   如果Java虚拟机栈可以动态扩展,并且扩展的动作已经尝试过,但是目前无法申请到足够的内存去完成扩展,或者在建立新的线程时没有足够的内存去创建对  应的虚拟机栈,那Java虚拟机将会抛出一个OutOfMemoryError异常。

2.3Java堆

  在Java虚拟机中,堆(Heap)是可供各条线程共享的运行时内存区域,也是供所有类实例和数组对象分配内存的区域。

  Java堆可能发生如下异常情况:如果实际所需的堆超过了自动内存管理系统能提供的最大容量,那Java虚拟机将会抛出一个OutOfMemoryError异常。

2.4方法区 方法区是堆的逻辑组成部分

  在Java虚拟机中,方法区(Method Area)是可供各条线程共享的运行时内存区域。,它存储了每一个类的结构信息,例如运行时常量池(Runtime Constant   Pool)、字段和方法数据、构造函数和普通方法的字节码内容、还包括一些在类、实例、接口初始化时用到的特殊方法。

2.5运行时常量池

  常量池它包括了若干种不同的常量:从编译期可知的数值字面量到必须运行期解析后才能获得的方法或字段引用。

  每一个运行时常量池都分配在Java虚拟机的方法区之中,在类和接口被加载到虚拟机后,对应的运行时常量池就被创建出来。

2.6本地方法栈

  Java虚拟机实现可能会使用到传统的栈来支持native方法(指使用Java以外的其他语言编写的方法)的执行,这个栈就是本地方法栈。

推荐阅读