[转贴]JVM之数据区结构

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

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

与Stack相关的异常有:
固定大小的Stack会StackOverflowError
动态大小的Stack会OutOfMemoryError。

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

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

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

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

6.Native方法Stack
 JVM可以使用C Stacks支持Native方法。Native方法是非Java语言实现的方法。Native方法Stack也可以用在用C语言或者其他语言实现JVM指令集解释器上。如果不能使用Native方法或者不依赖于C Stacks的JVM不用提供Native方法Stack。Native方法Stack在每个线程创建时被线程分配。它可以是固定大小,也可是动态的。
与Native方法Stack相关的异常有:
固定大小的Stack会StackOverflowError
动态大小的Stack会OutOfMemoryError。

6.Frames(翻译成框架可不好)
 一个Frame用来保存数据和部分结果。他也用来执行动态链接,返回方法值和调度异常。
    每次方法被调用的时候会创建一个新Frame。当方法调用结束时,Frame被Destroy。Frame是JVM 线程Stack的一部分。每个Frame有它自己的本地变量数组,操作数Stack和一个当前方法的运行期常数池的引用(指针)。

    本地变量数组的大小和操作数Stack的大小取决于编译期间与方法代码。在一个线程内,只能有一个Frame是Active状态,这个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包含一个当前方法运行期常数池的引用。该引用为了支持方法代码的动态链接。一个方法是通过符号引用来调用其他方法和方法变量的。动态链接将这些符号引用翻译为具体的方法引用(地址)。动态链接将加载所需的类解析尚未定义的符号。
 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=931455

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值