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(本地方法变量),类型有占一个存储空间的boolean,byte,char,short,int,float,reference,returnAddress. 占两个存储空间的longordouble.,被生成索引排序,从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:同上
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/zhjali123/article/details/47699323