JVM学习笔记之方法运行

之前写了JVM对方法的调用过程,这里结合锁机制讲讲方法运行的过程。

    首先方法运行是在JVM的“运行时数据区”进行的,所以得了解下运行时数据区,包括如下部分(基本定义为网上都有,这里仅仅做个介绍,详细的就不说了):
PC寄存器 : 实现多线程基础,每个java虚拟机线程在运行某个方法时,如果方法是本地方法,则PC寄存器值没有定义,如果是则PC寄存器值记录JVM指令地址。
栈 : 每个JVM线程在创建同时,会创建一个对应的栈,主要用来操作“框架”。“框架”也属于运行时数据区,但它仅仅是JVM线程对应栈的一部分。具体后面再说。
堆 : 所有JVM线程共享,存放类实例和数组的地方。GC重点照顾对象
方法区 : 所有JVM线程共享,可以认为是存放加载后的class模板的地方,一般GC可不照顾。
常数池 : 从方法区分配,包含编译期已知的数值文字和运行期解析的各种引用。
自身方法栈 : 用来支持非java的本地方法栈。具体也不必深究了。
如图(不清楚的看附件吧,深入JVM虚拟机中也有):
   JVM学习笔记之方法运行

    接下来我想说说框架,我在网上看过很多技术帖,没有解释“框架”的。所以这里说下。
“框架”可以理解为“范围+事务”,每段程序里,都有“局部变量”和“全局变量”,局部和全局都是相对的,那么JVM区分局部和全局就是靠“框架”来完成的。框架用于存储数据和部分结果,并包含动态链接,返回值或者异常,每个框架都包含局部变量集和操作数栈。每个方法被调用时会创建一个新框架,方法结束后,对应的框架就被撤销,框架由调用方法的栈分配和销毁。对于每个线程的某一时刻只有一个框架内的方法是运行的,其他的框架都属于等待,一个线程创建的框架不能被别的线程直接引用(有点锁的意思没?),具体创建和分配的相关很多,这里就不细说了。

    最后说下方法运行的过程,当运行方法A时,首先栈创建一个框架A,框架中执行方法A,如果发现方法A里调用了另一个方法B,则创建框架B并压入栈(栈顶上移框架B的长度),此时框架A“等待”框架B运行,如此类推,直到方法B运行结束并将返回值(或异常)返回给方法A,框架B释放(栈顶下移框架B的长度),方法A继续运行至结束并返回相关数据,框架A结束(栈顶下移框架A的长度)释放框架A,结束。

    由此可见,加载类时的继承过程,递归过程,底层实现是一样的。

    最后,欢迎拍砖。



你可能感兴趣的:(java,jvm,虚拟机,框架)