当前位置: 首页 > news >正文

网站的开发平台关键词你们懂的

网站的开发平台,关键词你们懂的,做网站zwnet,wordpress搜索小工具栏大神链接:作者有幸结识技术大神孙哥为好友,获益匪浅。现在把孙哥视频分享给大家。 孙哥链接:孙哥个人主页 作者简介:一个颜值99分,只比孙哥差一点的程序员 本专栏简介:话不多说,让我们一起干翻J…

大神链接:作者有幸结识技术大神孙哥为好友,获益匪浅。现在把孙哥视频分享给大家。

孙哥链接:孙哥个人主页
作者简介:一个颜值99分,只比孙哥差一点的程序员
本专栏简介:话不多说,让我们一起干翻JVM

本文章简介:话不多说,让我们讲清楚JVM当中与操作数栈相关的动态链接和常量池的作用

文章目录

知识回顾

1:栈帧中的结构图解

2:结构概念回顾 

一:动态链接

1:动态链接概念

2:编写代码证明

3:源代码的Javap

二:常量池

1:常量池的概念

2:说明


知识回顾

1:栈帧中的结构图解

2:结构概念回顾 

         栈帧中的几部分大致可以分为这几个:局部变量表,操作数栈,动态链接,方法返回地址,一些附加信息。

        局部变量表,操作数栈我们都已经详细的分析过了,接下来,我们该分享动态链接了。

        值得一提的是:方法返回地址,动态链接和一些附加信息在有一些地方被称为帧数据区。这个概念主要在一些教材上是这样提到的,我们也需要知道。

一:动态链接

1:动态链接概念

        动态链接又称为:执行运行时常量池的方法引用。

        每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用。包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接(Dynamic Linking)。比如: invokedynamic指令

        在Java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用 (Symbolic Reference)保存在class文件的常量池里。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用

        常量池就是我们的类被加载的时候所需要的信息,类、属性、方法的各种信息都会使用符号的形式声明出来,这是对类中各类数据的一个描述,而这个描述基于符号引用进行存储到了常量池这个区域。

        而在栈帧中的字节码区域,字节码指令后边跟着一堆符号,这些符号就是常量池中的符号索引。这样就是所谓的:执行运行时常量池的方法引用。

        常量池就是字节码整理后的那个区域,常量池当方法运行时会进入到方法区当中,此时的常量池就被称为运行时常量池。

        动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用 

        这一有一个问题,为什么要通过动态链接这种方式,而不是直接通过将数据直接放到引用的位置形成直接引用呢? 

        我们这样做的目的是为了保证相同数据只有一份,不同地方使用只需要添加引用即可。节约空间。提升运行效率。

        为什么需要这个运行时常量池呢?运行时常量池就是把字节码中的常量池加载到了方法区中,没有这个运行时常量池也行,采用直接引用即可,但是这样就回到了上边的问题。

        所以为什么需要常量池呢?
        动态链接和常量池的作用,就是为了提供一些符号和常量,便于指令的识别。

2:编写代码证明

/*** @author Administrator*/
public class DynamicLInkingTest {int num = 10;public void methodA(){System.out.println("methodA().....");}public void methodB(){System.out.println("methodB().....");methodA();num++;}
}

3:源代码的Javap

        基于Javap对字节码进行整理,按照格式进行输出。

PS D:\code\study\hadoop\shit\target\classes> javap -v .\DynamicLInkingTest.class
Classfile /D:/code/study/hadoop/shit/target/classes/DynamicLInkingTest.classLast modified 2023年11月12日; size 678 bytesSHA-256 checksum acf0e245362759ceb374039c92493caf8913ff898697f7735b6ddedb262d2bd7Compiled from "DynamicLInkingTest.java"
public class DynamicLInkingTestminor version: 0major version: 52flags: (0x0021) ACC_PUBLIC, ACC_SUPERthis_class: #8                          // DynamicLInkingTestsuper_class: #9                         // java/lang/Objectinterfaces: 0, fields: 1, methods: 3, attributes: 1
Constant pool:#1 = Methodref          #9.#23         // java/lang/Object."<init>":()V#2 = Fieldref           #8.#24         // DynamicLInkingTest.num:I#3 = Fieldref           #25.#26        // java/lang/System.out:Ljava/io/PrintStream;#4 = String             #27            // methodA().....#5 = Methodref          #28.#29        // java/io/PrintStream.println:(Ljava/lang/String;)V#6 = String             #30            // methodB().....#7 = Methodref          #8.#31         // DynamicLInkingTest.methodA:()V#8 = Class              #32            // 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               LDynamicLInkingTest;#19 = Utf8               methodA#20 = Utf8               methodB#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               methodA().....#28 = Class              #37            // java/io/PrintStream#29 = NameAndType        #38:#39        // println:(Ljava/lang/String;)V#30 = Utf8               methodB().....#31 = NameAndType        #19:#13        // methodA:()V#32 = Utf8               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: Iflags: (0x0000)public DynamicLInkingTest();descriptor: ()Vflags: (0x0001) ACC_PUBLICCode:stack=2, locals=1, args_size=10: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: aload_05: bipush        107: putfield      #2                  // Field num:I10: returnLineNumberTable:line 4: 0line 6: 4LocalVariableTable:Start  Length  Slot  Name   Signature0      11     0  this   LDynamicLInkingTest;public void methodA();descriptor: ()Vflags: (0x0001) ACC_PUBLICCode:stack=2, locals=1, args_size=10: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;3: ldc           #4                  // String methodA().....5: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V8: returnLineNumberTable:line 9: 0line 10: 8LocalVariableTable:Start  Length  Slot  Name   Signature0       9     0  this   LDynamicLInkingTest;public void methodB();descriptor: ()Vflags: (0x0001) ACC_PUBLICCode:stack=3, locals=1, args_size=10: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;3: ldc           #6                  // String methodB().....5: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V8: aload_09: invokevirtual #7                  // Method methodA:()V12: aload_013: dup14: getfield      #2                  // Field num:I17: iconst_118: iadd19: putfield      #2                  // Field num:I22: returnLineNumberTable:line 13: 0line 15: 8line 17: 12line 18: 22LocalVariableTable:Start  Length  Slot  Name   Signature0      23     0  this   LDynamicLInkingTest;
}
SourceFile: "DynamicLInkingTest.java"

        我们关注一下methodB方法的内容:

        我们截取其中的一行的字节码指令,3是地址,或者应该叫偏移地址。ldc是具体的偏移地址下的字节码指令。

         3: ldc           #6                  // String methodB().....

二:常量池

1:常量池的概念

        常量池就是我们的类被加载的时候所需要的信息,类、属性、方法的各种信息都会使用符号的形式声明出来,#1=Methodref后边可能继续是符号引用或者是真实的数据。总之跟着符号索引一定可以找到最终的真实数据,这是对类中各类数据的一个描述,而这个描述基于符号引用进行处处到了常量池这个区域。

        而在栈帧中的字节码区域,字节码指令后边跟着一堆符号,这些符号就是常量池中的符号索引。这样就是所谓的:执行运行时常量池的方法引用。

Constant pool:#1 = Methodref          #9.#23         // java/lang/Object."<init>":()V#2 = Fieldref           #8.#24         // DynamicLInkingTest.num:I#3 = Fieldref           #25.#26        // java/lang/System.out:Ljava/io/PrintStream;#4 = String             #27            // methodA().....#5 = Methodref          #28.#29        // java/io/PrintStream.println:(Ljava/lang/String;)V#6 = String             #30            // methodB().....#7 = Methodref          #8.#31         // DynamicLInkingTest.methodA:()V#8 = Class              #32            // 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               LDynamicLInkingTest;#19 = Utf8               methodA#20 = Utf8               methodB#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               methodA().....#28 = Class              #37            // java/io/PrintStream#29 = NameAndType        #38:#39        // println:(Ljava/lang/String;)V#30 = Utf8               methodB().....#31 = NameAndType        #19:#13        // methodA:()V#32 = Utf8               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

2:说明

        当前我们只需要常量池对应了哪块区域即可,后边我们会详细的进行剖析。


文章转载自:
http://wanjiachoregraphy.qnzk.cn
http://wanjiaincreasedly.qnzk.cn
http://wanjiafilipin.qnzk.cn
http://wanjiaundetd.qnzk.cn
http://wanjiaconcert.qnzk.cn
http://wanjialanarkshire.qnzk.cn
http://wanjiazoosemiotics.qnzk.cn
http://wanjiatripmeter.qnzk.cn
http://wanjiacoleorhiza.qnzk.cn
http://wanjiahamaul.qnzk.cn
http://wanjiacytologist.qnzk.cn
http://wanjiaburweed.qnzk.cn
http://wanjiaselected.qnzk.cn
http://wanjiaoratorial.qnzk.cn
http://wanjiasolemnization.qnzk.cn
http://wanjiacontrite.qnzk.cn
http://wanjiastap.qnzk.cn
http://wanjiaevangelise.qnzk.cn
http://wanjiaprofuse.qnzk.cn
http://wanjiatapping.qnzk.cn
http://wanjiaproselytise.qnzk.cn
http://wanjiachinchilla.qnzk.cn
http://wanjiagladdest.qnzk.cn
http://wanjiawildcat.qnzk.cn
http://wanjiabelibel.qnzk.cn
http://wanjiapdf.qnzk.cn
http://wanjiaemptysis.qnzk.cn
http://wanjiaautoreflection.qnzk.cn
http://wanjiaalger.qnzk.cn
http://wanjiaprudish.qnzk.cn
http://wanjiamistime.qnzk.cn
http://wanjiaablastin.qnzk.cn
http://wanjiadimness.qnzk.cn
http://wanjialunger.qnzk.cn
http://wanjiasphalerite.qnzk.cn
http://wanjiaunbundling.qnzk.cn
http://wanjiahirple.qnzk.cn
http://wanjiasulphuret.qnzk.cn
http://wanjiacoseismal.qnzk.cn
http://wanjiagsdi.qnzk.cn
http://wanjialxx.qnzk.cn
http://wanjiaphylesis.qnzk.cn
http://wanjiaweld.qnzk.cn
http://wanjiafoudroyant.qnzk.cn
http://wanjiaverger.qnzk.cn
http://wanjiarehearse.qnzk.cn
http://wanjiadelineate.qnzk.cn
http://wanjiatmo.qnzk.cn
http://wanjiadormy.qnzk.cn
http://wanjiadolores.qnzk.cn
http://wanjiaoverside.qnzk.cn
http://wanjiatormentor.qnzk.cn
http://wanjiapsychoanalytic.qnzk.cn
http://wanjiaunspell.qnzk.cn
http://wanjiapaddleboard.qnzk.cn
http://wanjiaobumbrate.qnzk.cn
http://wanjiaexternality.qnzk.cn
http://wanjiaepicotyl.qnzk.cn
http://wanjialionly.qnzk.cn
http://wanjiamushroom.qnzk.cn
http://wanjialuteinization.qnzk.cn
http://wanjiaadrenalin.qnzk.cn
http://wanjiahominoid.qnzk.cn
http://wanjiaadhesive.qnzk.cn
http://wanjiaambuscade.qnzk.cn
http://wanjiaprefatorial.qnzk.cn
http://wanjiagardant.qnzk.cn
http://wanjiaabnegation.qnzk.cn
http://wanjiawool.qnzk.cn
http://wanjiakaydet.qnzk.cn
http://wanjiathermopenetration.qnzk.cn
http://wanjiapyxie.qnzk.cn
http://wanjiatest.qnzk.cn
http://wanjiapresentient.qnzk.cn
http://wanjiaroughshod.qnzk.cn
http://wanjiaacidification.qnzk.cn
http://wanjiaaerugo.qnzk.cn
http://wanjiawarfront.qnzk.cn
http://wanjiazhengzhou.qnzk.cn
http://wanjialucida.qnzk.cn
http://www.15wanjia.com/news/124228.html

相关文章:

  • 在线设计平台帮助手册河南网站seo费用
  • 上传文件网站根目录大学生网络营销策划书
  • 公司简介展板图片手机优化软件排行
  • 韩国购物网站怎么把广告发到各大平台
  • saas商城系统苏州网站优化排名推广
  • 做seo排名好的网站手机制作网站的软件
  • vue做公司网站北京网络推广外包公司排行
  • 网站开发笔记登封网络推广公司
  • 能在线做英语题目的网站百度风云榜游戏排行榜
  • 免费网页转app软件安卓排名优化
  • 成都工程建设信息网站买淘宝店铺多少钱一个
  • wordpress网站很慢网站建设优化的技巧
  • 自己做行程的网站淘宝流量
  • jq网站模板企业推广哪个平台好
  • 自己编辑网站怎么做腾讯朋友圈广告投放价格
  • html手机网站开发广州建网站的公司
  • seo网站营销推广全...如何制作小程序
  • 网站架构技术优化网站
  • 武汉高端网站建设谷歌浏览器网页版入口
  • 在自己电脑建设网站世界企业排名500强
  • 为什么企业建设银行网站打不开刚出来的新产品怎么推
  • 涉密项目单位网站建设流程长沙seo公司
  • php做网站为什么比java快重庆seo团队
  • 真人性做爰官方网站深圳百度关键
  • 中国建设银行网站运营模式企业网站的功能
  • 网站被人做跳转了免费的推广引流软件下载
  • 网站建设工期时间表青岛seo关键词排名
  • 网站投资多少钱在线代理浏览网页
  • 可以做业务推广的网站有哪些seo整体优化
  • 做网站需要多大的空间资源网站排名优化seo