常量池和方法区域的映射

时间:2017-12-15 05:45:59

标签: java jvm classloader

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

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

  2. 如何在方法区域中组织字节代码方法表是什么 由?

  3. 组成
  4. 任何人都可以向草图显示映射的图片表示  方法领域,以便清楚理解

3 个答案:

答案 0 :(得分:1)

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

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

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

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

  3. 还有字符串池,可以看作是运行时常量池的一部分,保存对与字符串常量关联的所有String实例的引用,以允许将所有类的所有相同字符串常量解析为相同的String实例。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

  1. 当您将源代码编译为.class文件时,javac会创建一个常量池。你可以看到它
  2.   

    javap -v MyClass

    到你的MyClass.class

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

      ' javap -c -v Main'

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