java - 常量池和方法区的映射

标签 java jvm classloader

我试图了解类文件如何加载到方法区并执行。我对常量池非常困惑。

  1. 常量池最初是什么时候创建的?编译时 类文件或类加载时。

  2. 字节码在方法区中是如何组织的 方法表是什么 组成?

  3. 任何人都可以显示草图,其中映射的图片表示 方法区以便清晰理解

最佳答案

由于“常量池”字面意思就是“常量池”,所以名字上有不同的东西,很容易混淆

  1. 每个类文件都有一个常量池,描述该类中使用的所有常量,其中包括常量值,还包括链接所需的符号引用。有些条目同时扮演这两个角色,例如类条目可以用作对成员的符号引用的所有者声明,在访问字段或调用方法时需要,但也可以用于获取 Class 实例,例如对于源代码中出现的类文字。由于它是类文件的一部分,因此其格式在 §4.4. The Constant Pool 中的《Java® 虚拟机规范》第 §4 类文件格式中指定。 .
    正如其他答案所述,您可以使用命令 javap -v class.name 来检查类的常量池。

  2. 运行时有对应的数据结构,也称为run-time constant pool 。由于某些值表示为运行时对象(例如 StringClassMethodTypeMethodHandle 类型),并且符号引用必须解析为所表示的类和成员的运行时表示,该结构与类文件中找到的字节序列不同。但这些条目是相对应的,因此每次为常量实例化对象或解析符号引用时,都可以记住结果并在下次访问相同的常量条目时重用。

    这并不意味着实现必须具有每个类的常量池的 1:1 表示。特定的实现可能会将类池映射到用于同一类加载上下文的所有类的共享池,其中每个符号引用解析为相同的目标。

  3. 还有字符串池,它可以被视为运行时常量池的一部分,保存对与字符串常量关联的所有 String 实例的引用,以允许解析所有类都指向同一个 String 实例。

关于java - 常量池和方法区的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47826481/

相关文章:

java - Map Stream 获取 Key 和 Value 乘积的总和

java - 无法让spring boot在gradle项目中自动创建数据库模式

java - 在 Java 中将字符串设置为私有(private)或公共(public)

tomcat - Apache-tomcat 6.0.39 webapps 类加载器与 JVM 类路径

JavaMelody 开销而不是 JMX

hadoop - Hadoop尝试将JVM挂断

java - JSP索引管理器-eclipse

multithreading - JDK 中的异步 NIO 是如何工作的?

memory-leaks - 如何诊断 Java 8 元空间泄漏?

java - 是否可以更改并非为支持依赖项注入(inject)而构建的闭源库中的错误类?