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 楼答案
我有个坏消息要告诉你。热点源中没有一个地方可以处理所有Java分配
分配可能发生在以下情况:
每种情况下的方法都大不相同。最简单的部分是VM运行时-它只是一个简单的C++代码,很容易修改,见图^{} 。
要修改解释器,您必须深入研究一些汇编代码,请参见^{}
C1分配也写在ASM中。不要忘记有多个分配路径:in TLAB、in Eden或返回到VM运行时的慢路径分配
将所有汇编代码乘以体系结构的数量:x86、ARM、AArch64、PPC等
C2是另一个挑战,因为它需要生成一些令人兴奋的IR图。顺便说一下,用于分配类实例和数组的图是不同的。如果你还想玩它,看看GraphKit::new_instance和GraphKit::new_array
我不是说“稍微改变一下分配策略”是绝对不可能的,但我要说的是,这是一项大量的工作,需要深入了解JVM
p.S.src/hotspot/share/memory/allocation.cpp与Java堆无关。此部分负责内部JVM的本机“C”分配