建设网站翻译英文平乡县网站建设
- 作者: 五速梦信息网
- 时间: 2026年03月21日 10:44
当前位置: 首页 > news >正文
建设网站翻译英文,平乡县网站建设,启东市建设局网站,复旦学霸张立勇做的有关寺庙网站大神链接#xff1a;作者有幸结识技术大神孙哥为好友#xff0c;获益匪浅。现在把孙哥视频分享给大家。 孙哥链接#xff1a;孙哥个人主页 作者简介#xff1a;一个颜值99分#xff0c;只比孙哥差一点的程序员 本专栏简介#xff1a;话不多说#xff0c;让我们一起干翻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:stack2, locals1, args_size10: 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:stack2, locals1, args_size10: 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:stack3, locals1, args_size10: 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常量池的概念 常量池就是我们的类被加载的时候所需要的信息类、属性、方法的各种信息都会使用符号的形式声明出来#1Methodref后边可能继续是符号引用或者是真实的数据。总之跟着符号索引一定可以找到最终的真实数据这是对类中各类数据的一个描述而这个描述基于符号引用进行处处到了常量池这个区域。 而在栈帧中的字节码区域字节码指令后边跟着一堆符号这些符号就是常量池中的符号索引。这样就是所谓的执行运行时常量池的方法引用。 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说明 当前我们只需要常量池对应了哪块区域即可后边我们会详细的进行剖析。
相关文章
-
建设网站翻译英文翻译wordpress设置权限设置
建设网站翻译英文翻译wordpress设置权限设置
- 技术栈
- 2026年03月21日
-
建设网站番禺哪些店铺适合交换友情链接
建设网站番禺哪些店铺适合交换友情链接
- 技术栈
- 2026年03月21日
-
建设网站对服务器有什么要求吗商标设计软件
建设网站对服务器有什么要求吗商标设计软件
- 技术栈
- 2026年03月21日
-
建设网站方面的知识网络营销策划书2000字
建设网站方面的知识网络营销策划书2000字
- 技术栈
- 2026年03月21日
-
建设网站费用记什么科目企业官方网站建设教程
建设网站费用记什么科目企业官方网站建设教程
- 技术栈
- 2026年03月21日
-
建设网站费用入什么科目Wordpress 微博 链接
建设网站费用入什么科目Wordpress 微博 链接
- 技术栈
- 2026年03月21日
