所以这是我在学习Java时想到的一个问题。我们知道(如果我错了,请纠正我!)字节码在 JVM 上运行。那么 JVM 是否会将字节码转换为它(JVM)为其编写的本机机器代码?如果是这样,不是更不安全吗?
什么是即时编译器?当被要求这样做时它会编译...我研究了一些资源,但仍然没有弄清楚及时的部分。
谢谢你的帮助 !
所以这是我在学习Java时想到的一个问题。我们知道(如果我错了,请纠正我!)字节码在 JVM 上运行。那么 JVM 是否会将字节码转换为它(JVM)为其编写的本机机器代码?如果是这样,不是更不安全吗?
什么是即时编译器?当被要求这样做时它会编译...我研究了一些资源,但仍然没有弄清楚及时的部分。
谢谢你的帮助 !
那么 JVM 是否会将字节码转换为它(JVM)为其编写的本机机器代码?
不,不一定。不过,现在默认情况下这样做是最先进的。
如果是这样,不是更不安全吗?
比什么更不安全?仅仅因为可以在机器代码中执行不安全的操作(例如取消引用未初始化的指针或访问未分配的内存)并不意味着 JIT 会生成这种不安全的代码。
什么是即时编译器?
它是 JVM 中将字节码转换为本机机器码的部分。名称“及时”意味着代码在执行时被编译(在单独的线程中)。编译完成后,JVM 会注意到某些方法已编译并且可以在机器级别调用。
那么 JVM 是否将字节码转换为它(JVM)为其编写的本机机器码?
到目前为止,我看到的所有 JVM 实现都将字节码转换为 VM 编写的本机机器码。虽然我看不出如何以及为什么这样做会有用。
什么是即时编译器?
它只是在运行时将字节码转换为本机代码的过程。尽管为了提高性能,它是由 VM 与您的程序执行并行完成的。它通常还包括编译后的本机代码缓存和其他一些性能改进技术。
如果是这样,不是更不安全吗?
嗯,在某种程度上它是。非常非常小的学位。对不同的操作系统进行了一些与安全相关的修改,消除了 JIT 编译。例如,grsecurity Linux 内核补丁实际上是在做 JIT 不可能的(实际上是在做不可能执行 JIT 编译的代码)。另一个事实是,iOS 中实现了类似的内存保护机制(可写内存页面不能执行),这使得在用户模式下无法进行任何 JIT 编译。