一、方法区 - 运行时常量池
常量池,可以看做是一张表,虚拟机指令根据这张常量表找到要执行的类名,方法名,参数类型,字面量等类型。
运行时常量池 vs 常量池
- 方法区,内部包含了运行时常量池
- 字节码文件,内部包含了常量池
要弄清楚方法区,需要理解清楚ClassFile,因为加载内的信息都在方法区。
要弄清楚方法区的运行时常量池,需要理解清楚ClassFile中的常量池。
image为什么需要常量池?
一个Java源文件中的类、接口,编译后产生一个字节码文件。而Java中的字节码需要数据支持,通常这种数据会很大以至于不能直接存在字节码文件,换另一种方式,可以存在常量池,这个字节码包含了指向常量池的引用。在动态链接的时候会用到运行时常量池。
什么是符号引用?什么是直接应用?
什么是动态链接?
动态链接就是指向运行时常量池的方法引用,动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。
在Java源文件被编译到的字节码文件中时,所有的变量和方法引用都作为符号引用保存在Class文件中的常量池里面。
符号引用 ----> 直接引用
栈帧
[图片上传失败...(image-b8ec8b-1600702650468)]
动态链接
image1.1运行时常量池
-
运行时常量池是方法区的一部分
-
常量池表是Class文件的一部分,用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
-
运行时常量池,在加载类和接口道虚拟机后,就会创建对应的运行时常量池。
-
JVM为每个已加载的类型(类或接口)都维护一个常量池,池中的数据项像数组一样,通过索引访问的。
-
运行时常量池中包含多种不同的常量,包括编译期就已经明确的数字字面量,也包括到运行时期解析后才能获得的方法或者字段应用,此时不再是常量池中的符号地址了。这里换为真实地址。
运行时常量池,相对于Class文件常量池的另一重要特征是:具备动态性
-
运行时常量池类似于传统编程语言中的符号表,但是它所包含的数据却比符号表要更加丰富一些。
-
当创建类或接口的运行时常量池时,如果构造运行时常量池所需的内存空间超过了方法区所能提供的最大值,则会抛出OOM异常。
网友评论