`
sslaowan
  • 浏览: 379543 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JVM方法调用指令

    博客分类:
  • JVM
 
阅读更多

     终于把Inside JVM这本看完了,好久没这么细致的看一本书了。

     好多人都写了文章讨论jvm如何实现多态的,我只是简单做个笔记。

     类的字节码结构有个常量池,其中就存放了这个类中调用的方法的符号引用,这些符号引用实际上是放在一些特殊类型(CONSTANT_NameAndType_info)的常量池入口中,调用方法有四个指令,invoke_static,invoke_special,invoke_virtual,invoke_interface。jvm指令是调用某个栈上的变量的方法,因此这个变量就有可能指向的是对象或者接口。

刚才提到直接引用,这个在常量池解析时,会将符号引用替换为直接引用。而对于不同情况,直接引用代表的东东是不同的。对于静态类变量,方法指的是本地指针,对于实例方法,指的就是方法表偏移量。

     对于类继承关系而言,从Object开始,所有类的方法的描述的方法在方法表中的索引(也就是在方法表中的位置的偏移量)都是一样的,比如toString方法,无论是在Object,还是在它的子类里,子类的子类里,这个偏移量都是一样的,因此如果栈上的那个变量指向的是一个类实例而不是一个接口,那么就可以替换这个方法调用的常量池入口的符号引用为这个偏移量,真正在运行时调用这个方法时,直接找到那个对象对应的类的方法表,用那个偏移量一下子就可以定位到具体的方法了。

      方法表是类基本信息的一部分,这个可以理解成一个中间表,将偏移量这个逻辑的index与方法真实的本地指针关联了起来(指向方法区,这个区是跟堆一样,所有线程共享的)。

      可以看到,如果是调用静态编译的方法,那么调用时,直接就可以找到本地指针去执行那个方法,如果是指向类的变量调用实例方法,那么就拿放在常量池中的偏移量到类方法表中去查到那个本地指针,再去执行那个方法。

      jvm还有一些指令,加了quick后缀,对于上面两种情况,在常量池解析后,实际上就会直接将原来的指令换为quick版本,将直接引用直接作为指令的操作数,这样就不用跑到常量池中去查一次了。

      那么对于栈中的变量是指向接口的情况怎么办。如果两个毫不相干的类都实现了某个接口,那么对于接口中的一个方法,在两个类的方法表中的偏移量就有可能是不同的,这个时候,在运行时,就只能用方法描述去到类的方法表中现去匹配,当然虚拟机在实现时,会有各种方法提高这个匹配的速度,比如预先分配一个数据结构做索引,或者是把成功匹配到的方法的偏移量做个mapping表,下次再访问时就可以快速找到了。

 

     另外,每调用一个方法时,当前线程就会创建一个frame,然后把它放到当前stack中,每个frame都包括局部变量区,操作数栈和frame变量区。那么一个方法里调用了另一个方法怎么办呢?那就再创建一个frame,去执行那个frame里所有的指令,执行完了再返回刚才那个frame继续执行。因此调用另一个方法是比较耗时的,这才有了方法内联这个优化。在编译类的时候,每个方法占多大内存都是计算好的,运行时中的方法区里保存了这些元数据,创建frame时就根据方法区的内容去创建就好了。

分享到:
评论

相关推荐

    JVM指令手册_jvm指令手册_

    **对象创建与访问指令**:`new`用于创建一个新的对象实例,`aload`和`astore`用于对象引用的加载和存储,`getfield`和`putfield`用于读写对象字段,`invokevirtual`、`invokespecial`、`invokestatic`、`invoke...

    JVM指令集.zip

    - **对象和数组操作指令**:涉及对象的创建、引用、方法调用以及数组的访问(如`new`创建新对象,`getfield`获取对象字段值,`invokevirtual`调用虚方法,`aaload`取数组元素)。 - **类和接口操作指令**:处理类...

    JVM指令码表.zip

    6. **方法调用与返回指令**:`invokevirtual`用于调用对象的虚方法,`invokespecial`用于构造函数调用和私有方法,`return`表示方法的结束。 7. **异常处理指令**:如`athrow`抛出异常,`catch`配合`try-catch`块...

    00-JVM指令手册.pdf

    根据手册中的内容,Java虚拟机指令集主要由加载和存储指令、算术指令、类型转换指令、对象创建和操作指令、操作数栈管理指令、控制转移指令、方法调用和返回指令、异常抛出指令等组成。通过这些指令的组合使用,可以...

    JVM指令查询手册.pdf

    对象操作指令涉及创建对象(如`new`),访问和调用方法(如`invokevirtual`,`invokespecial`),以及字段访问(如`getfield`, `putfield`)。数组操作指令如`iaload`加载数组中的int元素,`iastore`存储int元素到...

    JVM 方法调用之动态分派(详解)

    在编译时,JVM 会将 `object.f()` 调用转换为 `invokevirtual` 指令,用于动态地调用 `f()` 方法。 在运行时,JVM 会根据 `object` 的实际类型 `Sub`,在虚方法表中查找 `f()` 方法的索引项,然后将其转换为对应的...

    JVM指令手册.docx

    每个方法调用在JVM中都会创建一个栈帧,包含了局部变量表、操作数栈、动态链接和方法返回地址。局部变量表的大小在编译时确定,每个槽位可以存储一个基本类型或一个对象引用。对于基本类型,如int、float等,它们...

    JVM指令集 PDF 下载

    5. **对象操作指令**:涉及对象创建、方法调用和字段访问。`new`用于创建一个新的对象实例,`invokevirtual`用于调用对象的方法,`getfield`和`putfield`分别用于获取和设置对象的字段值。 6. **异常处理指令**:`a...

    中文版JVM指令手册.pdf

    ##### 调用指令 - `invokevirtual`:调用对象的实例方法。 - `invokestatic`:调用类方法(静态方法)。 - `invokeinterface`:调用接口方法。 - `invokespecial`:调用实例初始化方法、私有方法或者父类方法。 ###...

    jvm指令手册

    10. **方法调用与返回**:`invokevirtual`、`invokespecial`、`invokestatic` 和 `invokeinterface` 指令用于调用方法,`return` 指令结束方法执行并返回结果。 11. **异常处理**:JVM提供了异常处理框架,通过 `a...

    JVM图解-JVM指令-JVM原型图.rar

    - JVM指令是字节码,每条指令对应一个特定的操作,如加载和存储变量、算术运算、控制流程、对象创建和方法调用等。 - 指令手册会列出所有这些指令,比如`iconst_5`表示将整数5压入操作数栈,`aload_0`用于将局部...

    JVM指令集.docx

    9. **方法调用和返回**:`invokevirtual`用于调用实例方法,`invokespecial`用于调用构造器、私有方法和父类方法,`return`指令表示方法返回。 10. **对象创建和初始化**:`new`指令用于创建新的对象实例,` anew...

    慢慢的回味.call_stub–JVM Java调用的入口1

    这个函数是JVM调用Java方法的核心逻辑,它会验证调用参数,初始化调用栈,然后实际执行方法。 在调用之前,JVM会进行一系列的检查和准备工作。例如,它会检查当前线程是否是Java线程,调用的方法是否已知,是否处于...

    JVM指令手册.pdf

    在Java虚拟机(JVM)指令集中,指令被用来执行基本的算术、类型转换、对象创建和操作、方法调用等任务。JVM指令集设计为平台无关,这样同一个类文件可以在任何实现了Java虚拟机规范的平台上运行。JVM指令是基于操作...

    JVM调用Lambda的表达式实现方法原理详解.docx

    Java虚拟机(JVM)在执行Java代码时,会根据不同的方法调用场景使用不同的字节码指令。这里主要讨论的是`...总结来说,理解JVM中的这些调用指令和分派机制对于深入掌握Java的运行机制和优化代码性能至关重要。

    JVM指令手册.rar

    3. **对象处理指令**:这些指令涉及对象的创建、引用、方法调用等。例如,`new`指令用于创建一个新的对象,`invokevirtual`调用对象的方法,`getfield`获取对象的字段值。 4. **控制转移指令**:这类指令用于改变...

    00-JVM指令手册.zip

    - **方法调用指令**:如`invokevirtual`(调用实例方法)、`invokespecial`(调用构造函数或私有方法)等,处理方法调用。 5. **垃圾回收**:JVM的内存管理包括垃圾回收机制,通过`new`指令创建的对象,如果不再被...

    JVM指令

    - **类和接口操作指令**:如`aload_0`加载对象引用,`invokevirtual`调用实例方法,`invokestatic`调用静态方法。 - **异常处理指令**:如`athrow`抛出异常,`catch`捕获异常。 - **多线程指令**:如`monitorenter`...

    JVM方法执行的来龙去脉 - 简书1

    在这个过程中,JVM负责加载类、解析方法、分配内存以及执行指令。 在JVM内部,有一个名为`JavaCalls`的模块,它负责处理Java方法之间的调用。`JavaCalls`包含了多种函数,如`call_virtual()`、`call_special()`、`...

Global site tag (gtag.js) - Google Analytics