2 weixin 38125681 weixin_38125681 于 2017.09.07 00:36 提问

jvm类加载过程中,解析步骤究竟是干嘛的?

网上百度只有说解析是将常量池内的符号引用转化为直接引用。但是不懂是什么意思,有大神能解释下吗?举个例子说明下,最好附上内存图…

2个回答

Small_Mouse0
Small_Mouse0   Ds   Rxr 2017.09.07 10:19

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,符号引用在前一章讲
解Class文件格式的时候已经出现过多次,在Class文件中它以CONSTANT_Class_info、
CONSTANT_Fieldref_info、CONSTANT_Methodref_info等类型的常量出现,那解析阶段中所
说的直接引用与符号引用又有什么关联呢?
符号引用(Symbolic References):符号引用以一组符号来描述所引用的目标,符号可
以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。符号引用与虚拟机实现的
内存布局无关,引用的目标并不一定已经加载到内存中。各种虚拟机实现的内存布局可以各
不相同,但是它们能接受的符号引用必须都是一致的,因为符号引用的字面量形式明确定义
在Java虚拟机规范的Class文件格式中。
直接引用(Direct References):直接引用可以是直接指向目标的指针、相对偏移量或是
一个能间接定位到目标的句柄。直接引用是和虚拟机实现的内存布局相关的,同一个符号引
用在不同虚拟机实例上翻译出来的直接引用一般不会相同。如果有了直接引用,那引用的目
标必定已经在内存中存在。
虚拟机规范之中并未规定解析阶段发生的具体时间,只要求了在执行anewarray、
checkcast、getfield、getstatic、instanceof、invokedynamic、invokeinterface、invokespecial、
invokestatic、invokevirtual、ldc、ldc_w、multianewarray、new、putfield和putstatic这16个用于
操作符号引用的字节码指令之前,先对它们所使用的符号引用进行解析。所以虚拟机实现可
以根据需要来判断到底是在类被加载器加载时就对常量池中的符号引用进行解析,还是等到
一个符号引用将要被使用前才去解析它。

《深入理解java虚拟机》第七章

caozhy
caozhy   Ds   Rxr 2017.09.07 09:25

其实不叫解析,而是二次编译,将java字节码转换成可执行文件,至于引用,相当于编译中的链接步骤。

Csdn user default icon
上传中...
上传图片
插入图片