1

所以这是我在学习Java时想到的一个问题。我们知道(如果我错了,请纠正我!)字节码在 JVM 上运行。那么 JVM 是否会将字节码转换为它(JVM)为其编写的本机机器代码?如果是这样,不是更不安全吗?

什么是即时编译器?当被要求这样做时它会编译...我研究了一些资源,但仍然没有弄清楚及时的部分。

谢谢你的帮助 !

4

2 回答 2

0

那么 JVM 是否会将字节码转换为它(JVM)为其编写的本机机器代码?

不,不一定。不过,现在默认情况下这样做是最先进的。

如果是这样,不是更不安全吗?

比什么更不安全?仅仅因为可以在机器代码中执行不安全的操作(例如取消引用未初始化的指针或访问未分配的内存)并不意味着 JIT 会生成这种不安全的代码。

什么是即时编译器?

它是 JVM 中将字节码转换为本机机器码的部分。名称“及时”意味着代码在执行时被编译(在单独的线程中)。编译完成后,JVM 会注意到某些方法已编译并且可以在机器级别调用。

于 2013-07-09T18:28:28.170 回答
0

那么 JVM 是否将字节码转换为它(JVM)为其编写的本机机器码?

到目前为止,我看到的所有 JVM 实现都将字节码转换为 VM 编写的本机机器码。虽然我看不出如何以及为什么这样做会有用。

什么是即时编译器?

它只是在运行时将字节码转换为本机代码的过程。尽管为了提高性能,它是由 VM 与您的程序执行并行完成的。它通常还包括编译后的本机代码缓存和其他一些性能改进技术。

如果是这样,不是更不安全吗?

嗯,在某种程度上它是。非常非常小的学位。对不同的操作系统进行了一些与安全相关的修改,消除了 JIT 编译。例如,grsecurity Linux 内核补丁实际上是在做 JIT 不可能的(实际上是在做不可能执行 JIT 编译的代码)。另一个事实是,iOS 中实现了类似的内存保护机制(可写内存页面不能执行),这使得在用户模式下无法进行任何 JIT 编译。

于 2013-07-09T18:43:45.773 回答