您的位置:首页 > 编程语言 > Java开发

Java运行时数据区域简介

2016-12-01 10:34 204 查看
原文链接

Java运行时数据区域
程序计数器Program Counter

Java虚拟机栈Java Virtual Machine Stack

堆Heap

方法区Method Area

本地方法栈Native Method Stack

简要总结

其他相关的内容
运行时常量池

栈帧

局部变量表

操作数栈

Java运行时数据区域

在此讨论的内容是根据Java虚拟机规范(Java SE 7)相关内容做的总结。可能有不对的地方。

Java虚拟机定义了程序运行期间使用到的运行时数据区域,其中一些与虚拟机生命周期相同,另外一些与线程的生命周期相同。

Java运行时数据区域分为:

程序计数器(Program Counter)

Java虚拟机栈(Java Virtual Machine Stack)

堆(Heap)

方法区(Method Area)

本地方法栈(Native Method Stack)

程序计数器(Program Counter)

程序计数器是线程私有的,每条线程都有自己的程序计数器。如果一个线程正在执行的方法是Java方法,程序计数器保存的是Java虚拟机正在执行的字节码指令的地址;如果正在执行的方法是native的,程序计数器的值为undefined。

Java虚拟机栈(Java Virtual Machine Stack)

Java虚拟机栈也是线程私有的,与线程同时创建,用于存储栈帧(Fremas),栈帧用来存储局部变量表等信息。方法从调用到执行完成的过程就对应着一个栈帧从入栈到出栈的过程。

Java虚拟机栈可以被实现为固定大小的,此时每一条线程的Java虚拟机栈在线程创建的时候容量就已经确定;还可以被实现为根据计算动态扩展和收缩的。

Java虚拟机栈可能会发生异常:

如果线程请求的栈容量超过Java虚拟机栈允许的最大容量,会抛出StackOverflowError异常。

如果虚拟机栈可动态扩展,申请不到足够的内存去完成扩展,或者建立新线程时没有足够的内存去创建虚拟机栈,会抛出OutOfMemoryError异常。

堆(Heap)

堆是各个线程共享的运行时内存区域,也是所有的类实例和数组对象分配内存的区域。堆在虚拟机启动的时候被创建。

堆的容量可以是固定大小的,也可以是动态扩展和自动收缩的。Java堆的内存不需要保证是连续的。

Java堆可能发生异常情况:

实际所需的堆超过了最大容量,抛出OutOfMemoryError异常。

方法区(Method Area)

方法区也是被各个线程所共享的运行时内存区域。用于存储类的结构信息,例如运行时常量池,字段,方法数据,构造函数,普通方法的字节码内容,还包括一些在类,实例,接口初始化时用到的特殊方法。

方法区在虚拟机启动的时候被创建。方法区的容量可以是固定大小的,也可以是动态扩展和自动收缩的。内存空间不需要保证是连续的。

方法区可能发生异常的情况:

方法区的内存不能满足内存分配时,会抛出OutOfMemoryError异常。

本地方法栈(Native Method Stack)

用来支持native方法。跟虚拟机栈功能类似。抛出的异常情况也类似。

简要总结

程序计数器为线程私有,用来指示程序运行时的位置。

Java虚拟机栈是线程私有的,用来存储局部变量表等,出栈入栈对应着方法的结束开始。

堆是线程共享的区域,虚拟机启动时创建,创建的实例对象和数组都分配在堆上。

方法区是线程共享的区域,虚拟机启动时创建,用来存储类的信息,常量字段等等。

本地方法栈用来执行本地方法的。

其他相关的内容

运行时常量池

运行时常量池分配在方法区中,在类和接口被加载到虚拟机后,运行时常量池就会被创建出来。是类或者接口的常量池表示形式,用于存储编译期生成的各种字面量和符号引用。

可能会发生异常的情况:

构造运行时常量池所需的内存空间超过了方法区能提供的最大值,会抛出OutOfMemoryError异常。

栈帧

栈帧是线程私有的,随着方法的调用而创建,随着方法的结束而销毁。栈帧分配在Java虚拟机栈中,存储着局部变量表,操作数栈,和指向当前方法所属类的运行时常量池的引用。

局部变量表和操作数栈的容量是编译期确定的。

局部变量表

局部变量表存在于栈帧中,长度由编译器确定。局部变量表可以保存基本数据类型(boolean,byte,char,short,float,long,double),reference类型,returnAddress类型。long和double类型使用两个局部变量保存。

局部变量表用来完成方法调用时的参数传递。当方法被调用时,参数会传递到从0开始的连续局部变量表位置上。当实例方法被调用时,第0个局部变量存储的是this。

操作数栈

操作数栈存在于栈帧内部,长度由编译期确定。作用是计算时候临时数据的存储区域。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: