Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JVM:字节码混乱和JIT_Java_Compiler Construction_Jvm - Fatal编程技术网

Java JVM:字节码混乱和JIT

Java JVM:字节码混乱和JIT,java,compiler-construction,jvm,Java,Compiler Construction,Jvm,在我学习Java时,我想到了一个问题。我们知道,如果我错了,请纠正我!字节码在JVM上运行。那么JVM是否将字节码转换为它为之编写JVM的本机机器代码呢?如果是这样的话,它不是不那么安全吗 还有,什么是即时编译器?当它被要求这样做时,它会编译……我研究了一些资源,但仍然没有弄清楚“及时”部分 谢谢你的帮助 JVM是否将字节码转换为本机代码 这是为你写的 不,不一定。尽管如此,现在默认这样做是最先进的 如果是这样的话,它不是不那么安全吗 不如什么安全? 仅仅因为一个人可以在机器代码中执行不安全的操

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

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

谢谢你的帮助

JVM是否将字节码转换为本机代码 这是为你写的

不,不一定。尽管如此,现在默认这样做是最先进的

如果是这样的话,它不是不那么安全吗

不如什么安全? 仅仅因为一个人可以在机器代码中执行不安全的操作,比如取消对统一指针的引用或访问未分配的内存,并不意味着JIT会生成这样的不安全代码

还有,什么是即时编译器

正是JVM的这一部分将字节码转换为本机代码。 名称just-in-time意味着代码在执行时在单独的线程中编译。一旦编译完成,JVM会注意到某些方法已经编译,并且可以在机器级别调用

那么JVM是否将字节码转换为它为之编写JVM的本机机器码呢

到目前为止,我看到的所有JVM实现都是将字节码转换为VM编写的本机代码。虽然我不明白为什么做其他事情会有用

还有,什么是即时编译器

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

如果是这样的话,它不是不那么安全吗


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

为什么要及时调用它。而且JavaScript的运行方式也不太安全!我的意思是,正如他们所说的,安全性虽然不是现在Java的强项,但是对于代码运行的虚拟化来说。但是如果最终代码转换成机器代码,它与C或C++完全一样,只是我不需要编译它到本地的M/C代码,Oracle的好家伙为我写了一个JVM。不是这样吗?它和C或C++没有太大的相同。记住,JVM不仅仅是JIT。事实上,市场上有一些JVM允许提前编译—在编译时从Java源代码完全将字节码转换为本机代码,而不是在运行时使用JIT进行编译。使用这种AOT方法,JVM仍然应该在程序运行时加载并运行,以进行内存管理和垃圾收集,例如。1安全性比什么低?2在Java.class文件中不是字节码的代码可以转换为机器指令,也可以直接解释。3向机器指令的转换,如果完成,通常由一个即时编译器JITC完成,在JVM中静默运行。