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