JVM-class字节码文件结构概述

 Java代码在进行Javac编译的时候,并不像C和C++那样有“连接”这一步骤,而是在虚拟机加class文件的时候进行动态链接。也就是说,在class文件中不会保存各个方法、字段的最终内存布局信息,因此这些字段、方法的符号引用不经过运行期转换的话无法得到真正的内存入口地址,也就无法直接被虚拟机使用。当虚拟机运行时,需要从常量池获得对应的符号引用,再在类加载过程中的解析阶段将其替换为直接引用,并翻译到具体的内存地址之中
这里说明下符号引用和直接引用的区别与关联:
符号引用:符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无岐义地定位到目标即可。符号引用与虚拟机实现的内存布局无关,引用的目标并不一定已经加载到了内存中。
直接引用:直接引用可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。直接引用是与虚拟机实现的内存布局相关的,同一个符号引用在不同虚拟机实例上翻译出来的直接引用一般不会相同。如果有了直接引用,那说明引用的目标必定已经存在于内存之中了。


为什么不把基本类型放堆中?

首先是栈、堆的特点不同。(堆比栈要大,但是栈比堆的运算速度要快。) 将复杂数据类型放在堆中的目的是为了不影响栈的效率,而是通过引用的方式去堆中查找。(八大基本类型的大小创建时候已经确立大小。三大引用类型(类类型、接口类型、数组类型)创建时候无法确定大小)

简单数据类型比较稳定,并且只占用比较少的内存,将它放在空间小、运算速度快的栈中能够提高效率。

猜你喜欢

转载自blog.csdn.net/qq_39940205/article/details/121430200