【发布时间】:2015-03-23 10:43:46
【问题描述】:
所以我有这个方法,用Java写的:
public void myMethod(int y){
int x = 5 + y;
doSomething(x);
}
假设我的应用程序调用了很多次..
在 Java 虚拟机上运行此方法的编译代码时,JVM 将首先解释该方法。然后过了一段时间,如果我理解正确,它将决定将其编译为机器语言。
此时,
会被内存中的机器码覆盖吗?如果它被覆盖,大小差异的问题将如何解决?如果将其写入内存中的其他位置,加载到内存中的字节码是否会被释放?还有,如果字节码和jit编译的代码都在内存中,当应用再次点击这个方法时,JVM如何决定执行jit编译的代码而不是字节码?
【问题讨论】:
-
我的想法是,这种事情取决于您是在 Windows 机器上运行,还是在内存不足的微控制器上运行。换句话说,取决于平台,不是吗?
-
答案 1:你为什么在乎?答案 2:JVM 将每个方法的 JITCed 代码保存在 C 堆中,通过类对象的内部表示中的表链接到。仅当 JVM 结束或在极少数情况下“卸载”类时才会删除代码。这一切都由适当的魔法管理。
-
“C 堆”在这里确实是用词不当——如果它指的是使用调用 malloc 获得的内存(可能是页对齐的,也可能不是页对齐的),则必须将相应的页标记为可执行.更有可能的是,JIT 使用 mmap、VirtualAlloc 等为生成的代码分配内存。
-
@MartinTörnwall - “C 堆”是 JVM 内部堆的通用术语,它不是 GC 堆的一部分。至于它是如何实现的,这取决于它运行的操作系统(还有许多其他环境超出你的想象)。
-
@HotLicks 啊你为什么在乎这个家伙在这里......你好!