代码之家  ›  专栏  ›  技术社区  ›  Guest

常量池和方法区域的映射

  •  0
  • Guest  · 技术社区  · 7 年前

    我试图理解类文件是如何加载到方法区域并执行的。我对恒定池非常困惑。

    1. 初始创建常量池的时间?在编译 类文件或加载类时。

    2. 字节码在方法区域中的组织方式方法表 包括?

    3. 有人能在草图中显示地图的图片表示吗 清晰理解的方法区域
    3 回复  |  直到 7 年前
        1
  •  1
  •   Community basarat    4 年前

    由于“常量池”的字面意思只是“常量池”,因此该名称有不同的含义,很容易混淆

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

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

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

    3. 还有字符串池,可以将其视为运行时常量池的一部分,其中包含对所有 一串 与字符串常量关联的实例,以允许将所有类的所有相同字符串常量解析为相同的 一串 例子

        2
  •  0
  •   Curious Techie    7 年前

    编译Java文件时,所有对变量和方法的引用都作为符号引用存储在类的常量池中。

    以下是供您参考的链接: What is the purpose of the Java Constant Pool?

        3
  •  0
  •   Aleksandr Lovkov    7 年前
    1. 当您将源代码编译到时,javac会创建一个常量池。类文件。如果你

    javap-v MyClass

    给你的MyClass。班

    1. The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads. 您可以通过以下方式查看类文件的字节码:

    'javap-c-v Main'

    1. 方法区域只是堆的一部分,JVM在其中拥有有关此类的所有信息。