java jvm 方法区_Java JVM 运行时方法区

Run-Time Data Areas

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

02d3c04fc44f596c481013c88be3d962.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值