免责声明:将所有这些与一粒盐一起食用;这太过简单了。
1:您是对的,因为计算机本身不理解代码,这就是为什么需要JVM本身的原因。假装
XY意味着“将堆栈中的前两个元素相加并推入结果”。然后将实现JVM,如下所示:
for(byte bytepre : preToExecute) { if (bytepre == XX) { // ...do stuff... } else if (bytepre == XY) { int a = pop(); int b = pop(); push(a+b); } else if (bytepre == XZ) { // ...do stuff... } // ... and so on for each possible instruction ...}
JVM已在计算机的本机代码中实现了每条单独的指令,并从本质上查找了字节码的每个块以了解如何执行该指令。通过JIT编写代码,可以通过省略这种解释(例如,查找应该如何处理每条指令)来实现大幅度的加速。那,和优化。
2:JIT并没有真正运行代码;一切仍在JVM中运行。基本上,JIT在适当的时候将字节代码块转换为机器代码。当JVM遇到它时,它会认为“哦,嘿,这已经是机器代码了!亲爱的,现在我不必仔细检查每个字节,因为CPU可以自己理解它!我只是抽水,一切都会神奇地自行工作!”。
3:是的,可以通过这种方式预编译代码,以避免早期的解释和JITting开销。但是,这样做会损失一些非常有价值的东西。您会看到,当JVM解释代码时,它还会保留有关所有内容的统计信息。然后,当它对代码进行JIT时,它会知道使用不同部分的频率,从而使它可以在重要的地方对其进行优化,从而使常见的东西更快,而稀有的东西却被牺牲了,从而提高了整体性能。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)