现在的位置: 首页 > 综合 > 正文

JVM之数据区结构

2013年10月29日 ⁄ 综合 ⁄ 共 1869字 ⁄ 字号 评论关闭

1PC寄存器 

每个线程有一个PC寄存器,如果不是Native,则PC寄存器包含当前正在执行的Java虚拟机指令的地址,如果是Native则不定义。

 

2Stack  

线程私有,与线程同时创建的Java Stack。一个JVM Stack保存多个FrameFrame用来保存局部变量,部分结果,和方法返回值。Stack不一定是连续分配在内存中的。

       Stack相关的异常有

1固定大小的StackStackOverflowError

2 动态大小的StackOutOfMemoryError

 

3Heap

JVM有一个所有线程共享的HeapHeap保存类的实例和数组。存储在Heap里的内容由GC回收。Heap可以使动态的也可以是固定大小的。它不一定是连续分配在内存中的。

       Heap相关的异常有OutOfMemoryError

4.方法区

JVM有一个所有线程共享的方法区。方法区类似于UNIXtext segment。它用来保存常数池,Field,方法数据,已经方法的代码,构造函数(包括类实例化和接口初始化时的特殊方法,<init><cinit>)。方法区可以是固定的,也可以使动态的。虽然方法区是Heap的一部分,但是可以选择不被GC回收或者被压缩。它不一定是连续分配在内存中的。

与方法区相关的异常有OutOfMemoryError

 

       <init>表示构造函数,<cinit>表示不带参数并且是静态的类或者接口的初始化方法。

5.运行期常数池

       加载到内存中的Class文件内常数池Table就是运行期常数池。它包括各种常数,符号,和方法,域的引用。运行期常数池分配在方法区里。当JVM创建类或接口时,该类或接口的常数池也会加载到内存中。

与常数池相关的异常有OutOfMemoryError

6Native方法Stack

       JVM可以使用C Stacks支持Native方法。Native方法是非Java语言实现的方法。Native方法Stack也可以用在用C语言或者其他语言实现JVM指令集解释器上。如果不能使用Native方法或者不依赖于C StacksJVM不用提供Native方法Stack

       Native方法Stack在每个线程创建时被线程分配。它可以是固定大小,也可以是动态的。

       Native方法Stack相关的异常有

1固定大小的StackStackOverflowError

2 动态大小的StackOutOfMemoryError

6Frames(翻译成框架可不好)

       一个Frame用来保存数据和部分结果。他也用来执行动态链接,返回方法值和调度异常。

       每次方法被调用的时候会创建一个新Frame。当方法调用结束时,FrameDestroyFrameJVM 线程Stack的一部分。每个Frame有它自己的本地变量数组,操作数Stack和一个当前方法的运行期常数池的引用(指针)。

       本地变量数组的大小和操作数Stack的大小取决于编译期间与方法代码。在一个线程内,只能有一个FrameActive状态,这个Frame所关联的方法一定是在运行中,这个Frame叫做当前Frame,它所在的方法叫做当前方法,所在的类叫当前类。

       如果当前方法调用另一个方法,或者当前方法结束,这当前Frame停止。

       Frame不能被其他线程访问。

6.1 本地变量

       每个Frame有一个本地变量数组。大小取决于方法的代码。一个变量保存一个boolean, byte, char, short, int, float, 引用,或者返回地址的值。2个变量可以保存一个long 或者double值。

       JVM使用本地变量传递方法调用的参数。

6.2 操作数Stack

       每个Frame保存一个 LIFO Stack作为操作数Stack。当Frame建立的时候操作数Stack为空。JVM提供指令加载本地变量中的常量或值到操作数Stack。然后从操作数Stack中取值,计算,返回结果到操作数Stack。操作数Stack也用来准备传给方法的参数和接受方法的返回结果。

 

6.3 动态链接

       每个Frame包含一个当前方法运行期常数池的引用。该引用为了支持方法代码的动态链接。一个方法是通过符号引用来调用其他方法和方法变量的。动态链接将这些符号引用翻译为具体的方法引用(地址)。动态链接将加载所需的类解析尚未定义的符号。

 

抱歉!评论已关闭.