JVM符号引用和直接引用

参考

我太菜了看不懂,等我填坑

理解1:

符号引用就是字符串,这个字符串包含足够的信息,以供实际使用时可以找到相应的位置。你比如说某个方法的符号引用,如:“java/io/PrintStream.println:(Ljava/lang/String;)V”。里面有类的信息,方法名,方法参数等信息。

当第一次运行时,要根据字符串的内容,到该类的方法表中搜索这个方法。运行一次之后,符号引用会被替换为直接引用,下次就不用搜索了。直接引用就是偏移量,通过偏移量虚拟机可以直接在该类的内存区域中找到方法字节码的起始位置。

理解2:

第一次运行的时候,发现指令没有被解析,根据指令去把常量池中有关系的所有项找出来,得到以“UTF-8”编码描述的此方法所属的“类,方法名,描述符”的常量池项,这就是“符号引用”。之后根据这些信息去对应类的方法表里寻找对应的方法,得到方法表的偏移量(指针),这个偏移量(指针)就是“直接引用”,再将偏移量赋给常量池项#2(根据指令,在常量池里找到的第一个项)。 最后再将指令修改为:invokevirtual_quick,并把操作数修改成指向方法表的偏移量(指针), 并加上参数个数。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2022 Doke
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信