码迷,mamicode.com
首页 > 编程语言 > 详细

Java JVM 运行时方法区

时间:2015-08-16 12:23:46      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:jvm   虚拟机   语言   结构   

Run-Time Data Areas

随着VM或线程开始、结束的数据区域。官方文档是http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5 (盗用下图)

技术分享


The pc Register(程序计数寄存器):

Program Counter Register,随着线程开始结束。VM运行的方法:

1.非Native方法,持有正在运行操作的内存地址

2.Native方法 ,没指定,但一般均可以持有平台相关的指针。

表示程序现在执行到内存的哪里了。


Java Virtual Machine Stacks(虚拟机栈,栈):

Java Virtual Machine Stacks,随着线程开始接触,和语言中的Stack结构类似,

StackOVerflowError:大小固定,线程在运算中需要超过被许可的stack大小

OutOfMemoryError:  大小可动态变化,1,但是内存不足,无法满足扩展  2,创建新的线程初始化Stack时内存不足。

Native Method Stacks(本地方法栈)

功能类比Java Virtual Machine Stacks,只是用于标为Native的方法,就是C的方法。

Frame:

  stack内部有很多Frame,一个Frame对应一个方法。用于存储数据和部分的结果、进行dynamic linking(动态链接)、返回方法返回值、分发异常(Exception)。
 Frame在方法完成(正常的或异常打断)时销毁。大小在编译器已经分好了,所以之和VM的实现相关。(很正常敲完代码,A方法内部调用B方法,B方法调用C方法,那stack就:C->B->A固定了)。线程私有,无法被别的线程引用。

Local Variable(本地变量):

每个Frame都包含Local Variable array(本地方法变量),类型有占一个存储空间的 booleanbytecharshortintfloatreference,  returnAddress. 占两个存储空间的 long or double.,被生成索引排序,从0到size-1(就是array嘛)。reference就是对象实例的引用。
在index中,0是该方法所属实例的引用,就是this了。

Operands Stack(操作数栈):

每个frame都包含这个先进先出的栈,栈里是指令,比如1+1,2+2。大小编译时决定。(就是方法的内的操作,一行一行的,跟debug到方法内部一样)
Operands Stack在包含它的Frame创建时是空的,VM支持加载常量、local variable中的数值、字段到Operands Stack中。
指令中是指定类型的,比如java语言中1+1.0,加号和类型无关。但是指令iadd 就是标示两个int值相加。也有的指令是不操作数的类型的,比如dup、swap。

Dynamic Linking(动态链接):

每个Frame为了找到其对应的(动态链接)方法代码,都包含一个指向run_time pool(运行时常量池)的引用。class文件中的东西都是符号,你需要转换成对应的内存地址,这就是动态链接。

正常方法调用完成:

没抛出异常,Program Counter会往下东下(呵呵)

Heap(堆):

随着VM开始结束,内存用于储存所有类的实例(all class instances)和队列。

Heap对象通过GC回收,对象永远不要显式(代码主动的)回收,大小是固定or动态变更,

OutOfMemoryError:如果需要的内存超出了系统允许的会


Method Area(方法区):

随着VM开始结束,所有的线程共享。用于存储语言被编译后的代码,或类似操作系统处理的text片段(应该是说字节码的意思吧)。

存储:每个类的的结构——如run-time constant pool(运行时常量池),field(字段,属性),method data,方法和构建方法的代码,包括特殊的类和接口初始化的方法。

尽管Method Area是Heap逻辑上的一部分,但是简单的实现可能选择 不去 GC或压缩改区域。

OutOfMemoryError:同上

Run-Time Constant Pool(运行时常量池):

是每个类、每个接口在class文件中constant_pool表格的表示。包含常量:编译时期得知的数字和运行时必须要解析的字段引用。Run-Time Constant Pool充当的功能类似于Java语言中字符表(symbol table)。(就是public static final int NUM = 3,private String hello = “hello”,这个NUM和hello符号对应的东西)

每个Run-Time Constant Pool都是Method Area的一部分。当类或接口创建时生成。

OutOfMemoryError:同上




版权声明:本文为博主原创文章,未经博主允许不得转载。

Java JVM 运行时方法区

标签:jvm   虚拟机   语言   结构   

原文地址:http://blog.csdn.net/zhjali123/article/details/47699323

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!