java 虚拟机栈 动态链接的思考

844 阅读3分钟

动态链接(解析完就叫:运行时常量池的方法引用)

栈属于线程私有的数据区域,与线程同时创建,总数与线程关联,代表Java方法执行的内存模型。

在栈帧中,动态链接是通过符号引用来表示的,符号引用是一个标识符,它包含了方法的名称和所属的类或接口等信息。在方法调用时,虚拟机会通过符号引用进行解析,将其转化为实际的方法引用。 

具体地说,解析过程将符号引用映射到方法在内存中的地址。

这个映射过程包括两个步骤:解析和动态绑定。

 1. 解析(Resolution):解析是将符号引用转化为实际的方法引用的过程。在解析过程中,虚拟机会根据符号引用中的类或接口信息查找方法在内存中的地址。解析可以是静态解析或动态解析。 - 静态解析:在编译期间就能确定具体的方法引用,这个解析过程是在编译器进行的。编译器会通过符号引用直接找到对应的方法地址。 - 动态解析:在运行时通过符号引用来查找具体的方法引用。这个解析过程是在运行时进行的,通过运行时常量池中的符号引用来查找具体的方法地址。 

 2. 动态绑定(Dynamic Binding):动态绑定是指在解析完符号引用后,根据对象的实际类型确定要调用的方法的过程。动态绑定通过虚方法表来实现,它包含了类或接口中声明的虚方法的地址。根据对象的实际类型,在虚方法表中查找对应的方法地址,然后执行该方法。

总结来说,栈帧中的动态链接是通过符号引用来表示方法的引用,而解析和动态绑定过程将符号引用转化为方法在内存中的地址,以实现方法调用的动态性和多态性。

方法的执行是从动态链接解析出来的内存地址开始的。

在Java中,当一个方法被调用时,首先需要解析符号引用,将其转化为实际的方法引用,即确定方法在内存中的地址。这个过程通常是通过符号引用在运行时常量池中进行查找和匹配的。一旦符号引用被解析成实际的方法引用(内存地址),方法的执行就从这个地址开始。执行过程会按照方法的字节码指令一条一条地执行,包括方法的局部变量操作、操作数栈操作、方法调用等。

方法调用和方法运行 在Java中,栈帧中的动态链接通常是在方法调用时进行解析和绑定的,而不是在方法被运行时才解析和绑定。当方法被调用时,虚拟机会根据方法调用指令中的符号引用来进行动态链接的解析过程,将符号引用转化为实际的方法引用(内存地址)。这个解析过程一般发生在方法调用的前期准备阶段。

栈帧的构成

JVM内存结构

JVM内存结果和JVM内存模型