JVM:字节码混淆和JIT

时间:2013-07-09 18:18:45

标签: java compiler-construction jvm

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

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

  

JVM也将字节码转换为本机代码   是(JVM)为?写的?

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

  

如果是这样,那不是不太安全吗?

比什么不安全? 仅仅因为人们可以在机器代码中执行不安全的操作(比如解除引用一个单元化指针或访问未分配的内存)并不意味着JIT会生成这种不安全的代码。

  

究竟什么是即时编译器?

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

答案 1 :(得分:0)

  

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

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

  

究竟什么是即时编译器?

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

  

如果是这样,那不是不太安全吗?

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