【问题标题】:How the Bytecode get stored in method area and gets executed in jvm字节码如何存储在方法区并在 jvm 中执行
【发布时间】:2015-08-05 17:56:08
【问题描述】:

我从一些文章中看到,当jvm启动时,它会在内存中加载字节码,字节码将在方法区分类为类型信息、常量池、字段和方法信息、方法表、类变量。我试图了解执行流程是如何发生的。

  1. 字节码会逐行执行吗?如果是这样,那么逐行字节码将存储在哪里?

  2. 方法区组件(信息、常量池、字段和方法信息、方法表、类变量)如何帮助执行一个类

  3. 方法代码(函数中的某些逻辑)将存储在哪里执行?

    任何人都可以帮助获得一些知识吗?

【问题讨论】:

    标签: memory-management jvm runtime


    【解决方案1】:

    您提出的一些问题与实现有关,因此根据您选择的 java vm(Oracle 或其他),它们的实现方式可能略有不同。

    1. 是的,如果您只有一个线程。当.class 文件被加载时,您提到的所有the information contained 都存储在不同的数据结构中。通常,与单个方法相关的所有信息都将包含在方法元数据结构中,并且该结构将包含一个特定字段,其中包含一个字节数组/缓冲区以及所有方法的字节码(从method_infoCode 属性中的.class)。

    2. 除了“帮助”之外,还需要它们,因为该信息通常在字节码中被引用/使用。常量池就是一个很好的例子,用javap 反编译你的.class 你会注意到对池内容的引用。

    3. 1,“逻辑”用字节码表示,即java虚拟机的机器指令。您的代码被编译为字节码,然后为每个方法存储,这些数据和其他数据用于生成.class

    【讨论】:

    • 谢谢回复... 字节码会全部存入常量池吗?
    • 不,常量池(每个类1个,由所有方法使用)只包含常量字符串和字符串化的类引用。字节码与其他方法数据一起存储在不同的结构中(如果您的 vm 是用 c/c++ 编写的,则可能是 c 结构)。
    • 非常感谢您提供的信息...在下面的示例中,您能说出哪些将存储在常量池和方法数据中。另外,您能否在下面的代码中解释什么是符号引用,我已经读到在解析阶段,符号引用被方法区域中的实际内存替换.. public class JVM
    猜你喜欢
    • 2020-10-28
    • 2015-04-06
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    相关资源
    最近更新 更多