有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何以及在何处分配OpenJDK源代码中解释的堆内存?

我正试图为我的研究项目修改OpenJDK源代码。我想知道在Java程序中调用新操作符时的代码流

class MyFirstProgram {
    public static void main(String args[]) throws Exception{
        System.out.println("Hello World!");
        int i[] = new int[50];
    }
}

在OpenJDK源代码中,我在新的操作符实现中添加了一些打印内容。(路径:OpenJDKDev/src/hotspot/share/memory/allocation.cpp

我不确定是否检查了内存分配的正确文件。 看起来,即使我调用java-version,它也会打印我多次输入的消息

当我在Java程序中调用新用户时,我无法找到内存分配调用的确切方式(以及确切位置)

编辑: --&燃气轮机;使用JDK11


共 (1) 个答案

  1. # 1 楼答案

    我有个坏消息要告诉你。热点源中没有一个地方可以处理所有Java分配

    分配可能发生在以下情况:

    • 在虚拟机运行时
    • 在字节码解释器中
    • 在JIT编译的代码中:
      • 由C1编写
      • 由C2编制
      • 由格拉尔等编撰

    每种情况下的方法都大不相同。最简单的部分是VM运行时-它只是一个简单的C++代码,很容易修改,见图^{}

    要修改解释器,您必须深入研究一些汇编代码,请参见^{}

    C1分配也写在ASM中。不要忘记有多个分配路径:in TLABin Eden或返回到VM运行时的慢路径分配

    将所有汇编代码乘以体系结构的数量:x86、ARM、AArch64、PPC等

    C2是另一个挑战,因为它需要生成一些令人兴奋的IR图。顺便说一下,用于分配类实例和数组的图是不同的。如果你还想玩它,看看GraphKit::new_instanceGraphKit::new_array

    我不是说“稍微改变一下分配策略”是绝对不可能的,但我要说的是,这是一项大量的工作,需要深入了解JVM

    p.S.src/hotspot/share/memory/allocation.cpp与Java堆无关。此部分负责内部JVM的本机“C”分配