【jvm】虚拟机栈之动态链接

这篇具有很好参考价值的文章主要介绍了【jvm】虚拟机栈之动态链接。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、说明
  • 1.指向运行时常量池的方法引用
  • 2.每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用
  • 3.包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接(Dynamic Linking)
  • 4.在java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference)保存在class文件的常量池里。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的
  • 5.动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用
二、代码示例
package com.learning.stack.dynamic_linking;

/**
 * @Author wangyouhui
 * @Description 动态链接
 **/
public class DynamicLinkingTest {
    int num = 10;

    public void methodOne(){
        System.out.println("方法1执行了");
        methodTwo();
        num++;
    }

    public void methodTwo(){
        System.out.println("方法2执行了");
    }
}
三、生成的字节码
Classfile /F:/jdk-learning/jvm/target/classes/com/learning/stack/dynamic_linking/DynamicLinkingTest.class
  Last modified 2023-10-28; size 756 bytes
  MD5 checksum 96b3029ecd8f2d56b0fc46825936f83b
  Compiled from "DynamicLinkingTest.java"
public class com.learning.stack.dynamic_linking.DynamicLinkingTest
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #9.#23         // java/lang/Object."<init>":()V
   #2 = Fieldref           #8.#24         // com/learning/stack/dynamic_linking/DynamicLinkingTest.num:I
   #3 = Fieldref           #25.#26        // java/lang/System.out:Ljava/io/PrintStream;
   #4 = String             #27            // 方法1执行了
   #5 = Methodref          #28.#29        // java/io/PrintStream.println:(Ljava/lang/String;)V
   #6 = Methodref          #8.#30         // com/learning/stack/dynamic_linking/DynamicLinkingTest.methodTwo:()V
   #7 = String             #31            // 方法2执行了
   #8 = Class              #32            // com/learning/stack/dynamic_linking/DynamicLinkingTest
   #9 = Class              #33            // java/lang/Object
  #10 = Utf8               num
  #11 = Utf8               I
  #12 = Utf8               <init>
  #13 = Utf8               ()V
  #14 = Utf8               Code
  #15 = Utf8               LineNumberTable
  #16 = Utf8               LocalVariableTable
  #17 = Utf8               this
  #18 = Utf8               Lcom/learning/stack/dynamic_linking/DynamicLinkingTest;
  #19 = Utf8               methodOne
  #20 = Utf8               methodTwo
  #21 = Utf8               SourceFile
  #22 = Utf8               DynamicLinkingTest.java
  #23 = NameAndType        #12:#13        // "<init>":()V
  #24 = NameAndType        #10:#11        // num:I
  #25 = Class              #34            // java/lang/System
  #26 = NameAndType        #35:#36        // out:Ljava/io/PrintStream;
  #27 = Utf8               方法1执行了
  #28 = Class              #37            // java/io/PrintStream
  #29 = NameAndType        #38:#39        // println:(Ljava/lang/String;)V
  #30 = NameAndType        #20:#13        // methodTwo:()V
  #31 = Utf8               方法2执行了
  #32 = Utf8               com/learning/stack/dynamic_linking/DynamicLinkingTest
  #33 = Utf8               java/lang/Object
  #34 = Utf8               java/lang/System
  #35 = Utf8               out
  #36 = Utf8               Ljava/io/PrintStream;
  #37 = Utf8               java/io/PrintStream
  #38 = Utf8               println
  #39 = Utf8               (Ljava/lang/String;)V
{
  int num;
    descriptor: I
    flags:

  public com.learning.stack.dynamic_linking.DynamicLinkingTest();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: aload_0
         5: bipush        10
         7: putfield      #2                  // Field num:I
        10: return
      LineNumberTable:
        line 7: 0
        line 8: 4
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      11     0  this   Lcom/learning/stack/dynamic_linking/DynamicLinkingTest;

  public void methodOne();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=3, locals=1, args_size=1
         0: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #4                  // String 方法1执行了
         5: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: aload_0
         9: invokevirtual #6                  // Method methodTwo:()V
        12: aload_0
        13: dup
        14: getfield      #2                  // Field num:I
        17: iconst_1
        18: iadd
        19: putfield      #2                  // Field num:I
        22: return
      LineNumberTable:
        line 11: 0
        line 12: 8
        line 13: 12
        line 14: 22
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      23     0  this   Lcom/learning/stack/dynamic_linking/DynamicLinkingTest;

  public void methodTwo();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #7                  // String 方法2执行了
         5: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return
      LineNumberTable:
        line 17: 0
        line 18: 8
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       9     0  this   Lcom/learning/stack/dynamic_linking/DynamicLinkingTest;
}
SourceFile: "DynamicLinkingTest.java"
四、字节码说明
4.1 常量池
Constant pool:
   #1 = Methodref          #9.#23         // java/lang/Object."<init>":()V
   #2 = Fieldref           #8.#24         // com/learning/stack/dynamic_linking/DynamicLinkingTest.num:I
   #3 = Fieldref           #25.#26        // java/lang/System.out:Ljava/io/PrintStream;
   #4 = String             #27            // 方法1执行了
   #5 = Methodref          #28.#29        // java/io/PrintStream.println:(Ljava/lang/String;)V
   #6 = Methodref          #8.#30         // com/learning/stack/dynamic_linking/DynamicLinkingTest.methodTwo:()V
   #7 = String             #31            // 方法2执行了
   #8 = Class              #32            // com/learning/stack/dynamic_linking/DynamicLinkingTest
   #9 = Class              #33            // java/lang/Object
  #10 = Utf8               num
  #11 = Utf8               I
  #12 = Utf8               <init>
  #13 = Utf8               ()V
  #14 = Utf8               Code
  #15 = Utf8               LineNumberTable
  #16 = Utf8               LocalVariableTable
  #17 = Utf8               this
  #18 = Utf8               Lcom/learning/stack/dynamic_linking/DynamicLinkingTest;
  #19 = Utf8               methodOne
  #20 = Utf8               methodTwo
  #21 = Utf8               SourceFile
  #22 = Utf8               DynamicLinkingTest.java
  #23 = NameAndType        #12:#13        // "<init>":()V
  #24 = NameAndType        #10:#11        // num:I
  #25 = Class              #34            // java/lang/System
  #26 = NameAndType        #35:#36        // out:Ljava/io/PrintStream;
  #27 = Utf8               方法1执行了
  #28 = Class              #37            // java/io/PrintStream
  #29 = NameAndType        #38:#39        // println:(Ljava/lang/String;)V
  #30 = NameAndType        #20:#13        // methodTwo:()V
  #31 = Utf8               方法2执行了
  #32 = Utf8               com/learning/stack/dynamic_linking/DynamicLinkingTest
  #33 = Utf8               java/lang/Object
  #34 = Utf8               java/lang/System
  #35 = Utf8               out
  #36 = Utf8               Ljava/io/PrintStream;
  #37 = Utf8               java/io/PrintStream
  #38 = Utf8               println
  #39 = Utf8               (Ljava/lang/String;)V
4.1 方法调用
  • 1.methodOne方法调用methodTwo方法
9: invokevirtual #6                  // Method methodTwo:()V
  • 2.invokevirtual调用虚方法
  • 3. #6表示Methodref方法引用,指向#8.#30
 #6 = Methodref          #8.#30         // com/learning/stack/dynamic_linking/DynamicLinkingTest.methodTwo:()V
  • 4. #8表示Class
   #8 = Class              #32            // com/learning/stack/dynamic_linking/DynamicLinkingTest
  • 5. #32表示类为com/learning/stack/dynamic_linking/DynamicLinkingTest
  #32 = Utf8               com/learning/stack/dynamic_linking/DynamicLinkingTest
  • 6. #30表示名字和返回类型
  #30 = NameAndType        #20:#13        // methodTwo:()V
  • 7. #20表示名字为methodTwo
  #20 = Utf8               methodTwo
  • 8. #13表示返回类型为void
  #13 = Utf8               ()V
4.3 变量
  • 1. int num = 10;
#2 = Fieldref           #8.#24         // com/learning/stack/dynamic_linking/DynamicLinkingTest.num:I
  • 2. 属性引用,指向#8.#24
  • 3. #8表示Class
   #8 = Class              #32            // com/learning/stack/dynamic_linking/DynamicLinkingTest
  • 4. #32表示类为com/learning/stack/dynamic_linking/DynamicLinkingTest
  #32 = Utf8               com/learning/stack/dynamic_linking/DynamicLinkingTest
  • 5. #24表示名字和类型
  #24 = NameAndType        #10:#11        // num:I
  • 6. #10表示属性名字为num
  #10 = Utf8               num
  • 7. #11表示属性的类型int
  #11 = Utf8               I
4.4 字符串
  • 1. #4表示是字符串
   #4 = String             #27            // 方法1执行了
  • 2. #27表示Utf8的字符串"方法1执行了"
  #27 = Utf8               方法1执行了
4.5 父类Object
  • 1. #1表示方法引用
   #1 = Methodref          #9.#23         // java/lang/Object."<init>":()V
  • 2. #9表示类
   #9 = Class              #33            // java/lang/Object
  • 3. #33表示类名为java/lang/Object
  #33 = Utf8               java/lang/Object
4.6 System类
  • 1. #3表示属性引用
   #3 = Fieldref           #25.#26        // java/lang/System.out:Ljava/io/PrintStream;
  • 2. #25表示类
  #25 = Class              #34            // java/lang/System
  • 3. #34表示类名为java/lang/System
  #34 = Utf8               java/lang/System
  • 4. #26表示名称和类型
  #26 = NameAndType        #35:#36        // out:Ljava/io/PrintStream;
  • 5. #35表示名称为out
  #35 = Utf8               out
  • 6. #36表示类型为 Ljava/io/PrintStream
  #36 = Utf8               Ljava/io/PrintStream;

文章来源地址https://www.toymoban.com/news/detail-716321.html

到了这里,关于【jvm】虚拟机栈之动态链接的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM学习(八):运行时数据区——虚拟机栈(字节码程度深入剖析)

    目录 一、概述  1.1 基于栈结构的虚拟机  1.2 栈和堆 二、虚拟机栈(Java Virtual Machine Stack)详述 2.1 虚拟机栈介绍  2.2 虚拟机栈作用 2.3 虚拟机栈特点  三、栈中常见的异常  3.1 StackOverflowError异常 3.2 OutOfMemoryError异常 四、栈的运行原理 4.1 栈的存储单位  4.2 栈的运行原理 

    2024年02月01日
    浏览(43)
  • JVM第三篇 运行时数据区-虚拟机栈和PC程序计数器

    目录 1. JAVA中的线程  2.  栈区  2.1 栈帧 2.2 栈可能出现的异常 2.3 设置栈大小 3.程序计数器(PC)  4. PC和栈发挥的作用  5. 关于栈的常见面试题        虚拟机包含三大部分,类加载子系统,运行时数据区,执行引擎。运行时数据区又包含方法区,堆区,栈区,程序计数器,

    2024年02月11日
    浏览(48)
  • JVM内存管理、内存分区:堆、方法区、虚拟机栈、本地方法栈、程序计数器

    线程共享 堆         存放 实例 ,字符串常量(直接引用),静态变量,线程分配缓冲区(TLAB线程私有)。 垃圾收集器 管理的区域 方法区         非堆,和堆相对的概念。存储已被虚拟机加载的 类型信息 、常量、静态变量、即时编译器编译后的代码缓存等数据,内

    2024年02月10日
    浏览(41)
  • 4. 虚拟机栈

    由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。 有不少Java开发人员一提到Java内存结构,就会非常粗粒度地将JVM中

    2024年02月09日
    浏览(41)
  • 虚拟机栈概述

            由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器容易实现, 缺点是性能下降,实现同样的功能需要更多的指令。 1.2.1、虚拟机栈概念         Java虚拟机栈(Java

    2024年02月05日
    浏览(36)
  • 运行时内存数据区之虚拟机栈——操作数栈

    每一个独立的栈帧中除了包含局部变量表以外,还包含一个后进先出(Last-In-First-Out)的操作数栈,也可以称之为表达式栈(Expression Stack)。 操作数栈,在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即入栈(push)/出栈(pop)。 某些字节码指令将值压入操作数栈,

    2023年04月12日
    浏览(44)
  • 深入理解JVM虚拟机第二十七篇:详解JVM当中InvokeDynamic字节码指令,Java是动态类型语言么?

     😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨ 2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群: 583783824   📚📚  工作微信: BigTreeJava 拉你进微信群,免费领取! 🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞

    2024年02月04日
    浏览(46)
  • 【数据结构】栈的使用|模拟实现|应用|栈与虚拟机栈和栈帧的区别

    目录 一、栈(Stack) 1.1 概念 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的应用场景 1. 改变元素的序列 2. 将递归转化为循环 3. 括号匹配 4. 逆波兰表达式求值 5. 出栈入栈次序匹配 6. 最小栈 1.5 概念区分 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分

    2024年02月04日
    浏览(48)
  • JVM 虚拟机 ---> JVM 基础概念

    一、Java 跨平台 Java是一种 可跨平台 的编程语言,我们通常把 CPU 处理器与操作系统构成的计算机系统整体成为叫 平台 不同的 CPU ,差异主要在底层指令集不同,指令集分为精简指令集( RISC )和复杂指令集( CISC )。每个 CPU 都有自己的特定指令集 **指令集:**是CPU中用来计

    2024年02月09日
    浏览(41)
  • 动态链接库(三)--动态链接库的使用

    本文示例基于上章的Dll1项目生成的动态链接库学习简单使用. 所需文件:因为上节的示例没有添加Dll1.h头文件,因此这里只需Dll1.dll,Dll1.lib 在本文中会添加Dll1.h头文件以优化动态链接库的创建. 既然要在项目中使用别人创建生成的dll, 那么首先得将dll加载到自己得项目中去才

    2024年02月03日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包