转贴:JVM中的直接引用和符号引用http://blog.csdn.net/imzoer/article/details/8086255
JVM在装载class文件的时候,会有一步是将符号引用解析为直接引用的过程。
那么这里的直接引用到底是什么呢?
对于指向“类型”【Class对象】、类变量、类方法的直接引用可能是指向方法区的本地指针。
指向实例变量、实例方法的直接引用都是偏移量。实例变量的直接引用可能是从对象的映像开始算起到这个实例变量位置的偏移量。实例方法的直接引用可能是方法表的偏移量。
在《深入java虚拟机》书的第197页我们可以看到,子类中方法表的偏移量和父类中的方法表的偏移量是一致的。比如说父类中有一个say()方法的偏移量是7,那么子类中say方法的偏移量也是7。
书中第199页说,通过“接口引用”来调用一个方法,jvm必须搜索对象的类的方法表才能找到一个合适的方法。这是因为实现同一个接口的这些类中,不一定所有的接口中的方法在类方法区中的偏移量都是一样的。他们有可能会不一样。这样的话可能就要搜索方法表才能确认要调用的方法在哪里。
而通过“类引用”来调用一个方法的时候,直接通过偏移量就可以找到要调用的方法的位置了。【因为子类中的方法的偏移量跟父类中的偏移量是一致的】
所以,通过接口引用调用方法会比类引用慢一些。
下面介绍下什么是接口引用。
interface A{void say();}
class B implements A{}
class C{public static void main(String []s){A a=new B();a.say()}}
在上面的第三行代码中,就是用“接口引用”来调用方法。
--------------------------------------------------------------------
符号引用:
符号引用是一个字符串,它给出了被引用的内容的名字并且可能会包含一些其他关于这个被引用项的信息——这些信息必须足以唯一的识别一个类、字段、方法。这样,对于其他类的符号引用必须给出类的全名。对于其他类的字段,必须给出类名、字段名以及字段描述符。对于其他类的方法的引用必须给出类名、方法名以及方法的描述符。
分享到:
相关推荐
JVM规范详细定义了Java可执行代码(即字节码)的格式,包括操作码和操作数的语法和数值、标识符的数值表示方式、以及Java类文件中的Java对象和常量缓冲池在JVM中的存储映像。 这些定义为JVM解释器的开发人员提供了...
解析阶段将符号引用转换为直接引用;初始化则执行类的静态初始化块。 2. 运行时数据区:包括堆、方法区、程序计数器、虚拟机栈和本地方法栈。堆存储对象实例,方法区存放类信息,程序计数器记录当前线程执行的指令...
字面量包括文本字符串和声明为final的常量值等,而符号引用包括类或接口的符号引用、字段的符号引用、类中方法的符号引用等。常量池项以不同的类型存在,比如CONSTANT_Utf8_info、CONSTANT_Integer_info、CONSTANT_...
4. **解析**:此时,JVM将常量池中的符号引用转换为直接引用。这个阶段不是必需的,可以在类或接口被首次使用时动态解析。 5. **初始化**:最后,JVM执行类的初始化方法(),这包括静态变量的初始化和静态代码块的...
JVM的垃圾回收机制是为了自动释放不再被引用的对象所占用的内存,它涉及多个回收算法和策略。垃圾回收器会周期性地检查堆中的对象,标识出不再使用的对象,并回收其占用的空间。新生代和旧生代的堆结构设计是垃圾...
- **解析**:将符号引用转换为直接引用,以便在运行时定位类和方法。 - **初始化**:执行类的静态初始化代码块。 - **执行**:JVM解释器将字节码转化为机器码执行,现代JVM通过即时编译(JIT)技术进一步提高性能...
解析阶段是指虚拟机将常量池中的符号引用替换为直接引用的过程。符号引用就是class文件中的:1.CONSTANT_Class_info、2.CONSTANT_Field_info、3.CONSTANT_Method_info等类型的常量。 符号引用与虚拟机实现的布局...
5. **运行时常量池(字符串常量池)**:包含字面量和符号引用。字符串常量池是为了解决大量重复字符串导致的内存浪费问题,通过引用共享同一字符串实例,提高内存利用率。在JDK 6及之前,字符串常量池位于永久代;...
符号引用指的是类、字段、方法等的名称和描述符,而直接引用可以直接定位到所引用的目标。 #### 初始化 初始化阶段是对类进行初始化的过程,主要是为类的静态变量赋予正确的初始值。这一阶段会执行类构造器`()`,...
其中,常量池是类文件中最重要的一部分,它包括了两种信息:字面常量和符号引用。 字面常量包括了整数、长整数、字符串等类型,而符号引用则包括了方法的描述、字段的描述等信息。在 JVM 中,方法的描述包括了方法...
4. **解析**:将符号引用转换为直接引用。 5. **初始化**:为类的静态变量赋初始值。 **2.2 加载.class文件的方式** 加载`.class`文件的方式多样,常见的有: 1. **从本地系统直接加载**:最常见的加载方式,从...
解析将符号引用转为直接引用;初始化执行类的初始化方法()。 **运行时数据区优化** JVM提供了多种内存调优策略,如设置堆大小、新生代和老年代的比例、使用哪种垃圾收集器等,以提高应用性能。例如,CMS...
解析将符号引用转换为直接引用;初始化执行类的初始化方法。 接下来,垃圾回收是JVM自动管理内存的关键。JVM使用不同算法对堆内存进行垃圾回收,如新生代的复制算法、老年代的标记-整理算法或标记-清除算法。垃圾...
2. **验证**:这一阶段确保字节码的安全性,包括文件格式验证、元数据验证、字节码验证和符号引用验证,防止恶意代码对虚拟机造成危害。 3. **准备**:为类的静态变量分配内存并赋予默认初始值。非静态变量的内存...
- 符号引用替换为直接引用,便于直接访问目标。 7. **初始化**: - 执行类构造器()方法,根据源文件中出现的顺序执行类变量赋值和静态语句块。 这些知识点构成了JVM的基础,理解它们对于优化Java程序性能、调试...
1. **类加载检查**:当JVM遇到new指令时,会检查指令参数是否能定位到类的符号引用,并确认该类是否已经完成加载、解析和初始化。如果尚未完成,则首先执行类初始化过程。 2. **内存分配**: - **规整内存**:如果...
- **常量池**:包含编译期间所有引用的符号引用和字面量。 - **访问标志**:描述类或接口的访问权限和特征。 - **类索引**:指向常量池中该类全限定名的索引。 - **父类索引**:如果该类有父类,则指向父类的常量池...
这有助于更深入地理解JVM如何处理不同类型的对象引用和方法分派。 综上所述,Java虚拟机指令集是Java程序执行的关键组成部分。通过深入研究JVM的工作原理和指令集,可以帮助我们更好地理解和优化Java程序的性能。
- 运行时常量池:方法区的一部分,存储编译期生成的各种字面量和符号引用。 4. **垃圾收集(GC)**: - 垃圾收集的目的是自动回收不再使用的对象所占用的内存。 - 分代收集理论:将堆分为新生代(Eden、Survivor...