X Tutup
Skip to content

Latest commit

 

History

History
76 lines (42 loc) · 7.5 KB

File metadata and controls

76 lines (42 loc) · 7.5 KB

30.Java Runtime Data Areas.md

<img src="http://dl2.iteye.com/upload/attachment/0088/4629/2141b376-0a63-3a69-892a-f53117547d33.png"/ alt="Java Runtime Data Areas" title="Java Runtime Data Areas">

30.1 运行时数据区(Runtime Data Areas)

Java虚拟机为程序的运行提供了各种不同的数据区,部分数据区与JVM的生命周期一致(随JVM启动而分配,JVM退出而释放),而另一部分则跟线程绑定,随着线程的启动和退出进行分配和释放。

30.1.1 程序计数器(Program Counter Rigister)

Java虚拟机支持多个线程在同一时刻运行。每一个Java虚拟机线程拥有自己的程序计数器。在任意时刻,任意线程都处于一个方法中(称为当前方法(current method)),如果是该方法是非本地方法(not native method),则该程序计数器记录着Java虚拟机执行的当前指令的地址。而如果该方法为本地方法(native method),则该程序计数器为undefined。

30.1.2 Java虚拟机栈(Java Virtual Machine Stacks)

每个Java虚拟机线程都拥有各自的Java虚拟机栈,并与线程同时被创建。Java虚拟机栈用于存储帧(frames)。Java虚拟机栈跟传统语言的栈相似:存储局部变量、结果,同时参与方法的调用和返回。 Because the Java Virtual Machine stack is never manipulated directly except to push and pop frames, frames may be heap allocated. The memory for a Java Virtual Machine stack does not need to be contiguous.

在第一版的Java虚拟机规范中,Java虚拟机栈做为Java栈 为人们所熟知。这个规范允许Java虚拟机栈是固定的大小或根据需要通过计算来动态地扩展和收缩。如果Java虚拟机堆的大小是固定的,(If the Java Virtual Machine stacks are of a fixed size, the size of each Java Virtual Machine stack may be chosen independently when that stack is created.)

Java虚拟的实现可以提供让程序员或用户来控制Java虚拟栈初始大小,并且,可以让Java虚拟机栈在最小值和最大值的限制范围内根据实际需要动态地拓展或收缩。

以下异常情况与Java虚拟栈相关:

  • 如果线程需要的Java虚拟机栈大小超过限额,则抛出StackOverflowError
  • 如果Java虚拟机栈被设置为可动态拓展,当拓展时由于受限于物理内存的限制而无法实现拓展时,则抛出OutOfMemoryError

30.1.2 堆(Heap)

Java虚拟机具有一个由所有Java虚拟机线程共享的一个堆。堆是分配和储存所有的实例对象和数组的运行时数据区域

堆是在Java虚拟机启动时被创建的。堆的对象储存空间通过**自动存储管理系统(garbage collector简称gc)**进行回收,并不能像c/c++语言那样显示地进行释放。Java虚拟机没有指定限制使用的gc,这个可以由程序员和用户根据自己的情况来进行选择。堆可以是固定大小的,也可以通过计算来动态地拓展和收缩。同时,堆的内容空间地址不需要是连续的。

Java虚拟机的实现可以提供让程序员和用户控制初始的堆大小,并且,可以让栈在最小值和最大值的限制范围内根据实际需要动态地拓展或收缩。

以下异常情况与堆相关:

  • 当堆需要拓展的内存大小大于自动存储管理系统所能提供的内存大小时,抛出OutOfMemoryError

方法区(Method Area)

Java虚拟机拥有一个由所有Java虚拟机线程共享的方法区。方法区类似于传统语言的用于存储编译代码的内存区域。(The method area is analogous to the storage area for compiled code of a conventional language or analogous to the "text" segment in an operating system process. )它用于存储每个类的类结构,例如运行时常量池(Runtime Constant Pool),字段和方法数据,以及方法和构造方法的代码,包括类、实例和接口在初始化时使用的特殊方法。

方法区也是在Java虚拟机启动时创建的。虽然方法区作为堆的一部分,但简单的Java虚拟机的实现可能不会对这部分区域进行gc操作和内存紧凑操作。Java虚拟机规范并不强制规范方法区的存储位置和管理已编译代码的策略。方法区可以是固定大小,也可以根据实际需要对方法区的大小进行拓展和紧凑操作。同时,方法区的内存不需要是连续的。

Java虚拟机的实现应该提供让程序员和用户控制初始的方法区内存大小,并且,可以让方法区在最小值和最大值的限制范围内根据实际需要动态地拓展或收缩。

以下异常情况与方法区相关:

  • 如果方法区不能提供满足需要分配的内存时,Java虚拟机抛出OutOfMemoryError

###运行时常量池(Runtime Constant Pool) 运行时常量池是一个类或接口的class文件的中constant_pool表的运行时表示。它包含多种常量:编译期的数值型字面量,运行时的方法和字段的引用。运行时常量池提供类似于一个传统的编程语言中的符号表的功能,但它比典型的符号表包含了更广泛的范围中的数据。

每个运行时常量池都是在Java虚拟机的方法区中进行分配的(也就是说运行时常量池是方法区中的一部分)。类/接口的运行时常量池在类/接口创建时被Java虚拟机构造。

以下异常情况与类/接口的运行时常量池的创建相关:

当创建一个类或接口时,如果运行时常量池的创建需要更多的内存,而方法区没有足够的内存可以提供时,Java虚拟机抛出OutOfMemoryError

本地方法栈(Native Method Stacks)

Java虚拟机应该使用传统的栈(通俗地将:C栈)来对本地方法(非Java实现的方法)进行支持。Native method stacks may also be used by the implementation of an interpreter for the Java Virtual Machine's instruction set in a language such as C. Java Virtual Machine implementations that cannot load native methods and that do not themselves rely on conventional stacks need not supply native method stacks. If supplied, native method stacks are typically allocated per thread when each thread is created.

This specification permits native method stacks either to be of a fixed size or to dynamically expand and contract as required by the computation. If the native method stacks are of a fixed size, the size of each native method stack may be chosen independently when that stack is created.

Java虚拟机的实现应当提供这样的功能:程序员和用户可以控制本地方法栈的初始化大小,并且,可以让本地方法栈在最小值和最大值的限制范围内根据实际需要动态地拓展或收缩。

以下异常情况与本地方法栈相关:

  • 如果本地方法栈需要更多的内存,但无法进行分配时,Java虚拟机抛出StackOverflowError

If native method stacks can be dynamically expanded and native method stack expansion is attempted but insufficient memory can be made available, or if insufficient memory can be made available to create the initial native method stack for a new thread, the Java Virtual Machine throws an OutOfMemoryError.

拓展阅读

X Tutup