我多次听到Java妨碍JIT(即时)编译的情况,其可跨平台移植的字节码被JVM“解释”。但是,我真的不知道字节码是什么,以及JVM在Java语言体系结构中的实际含义。我想进一步了解他们。
JVM(Java虚拟机)具有与真实计算机一样的指令集。给该指令集的名称是Java字节码。在Java虚拟机规范中对其进行了描述。其他语言在执行之前会被翻译成字节码,例如ruby和python。Java的字节码处于相当低的级别,而python的则更高。
解释和JIT编译是执行字节码的两种不同策略。解释一次处理一个字节码,对每个指令中编码的虚拟机状态进行更改。JIT编译将字节码转换为主机平台本地的指令,这些指令执行等效的操作。
解释通常起步快,但执行过程慢,而JIT则有更多的启动开销,但之后运行得更快。现代JVM结合使用解释和JIT技术来获得两者的好处。在JIT在后台翻译字节码时,它首先被解释。JIT编译完成后,JVM将切换为使用该代码而不是解释器。有时,JIT编译会比C和C
++的提前编译产生更好的结果,因为它更具动态性。JVM可以跟踪代码的调用频率以及代码的典型路径,并在程序运行时使用此信息生成更有效的代码。JVM可以切换到此新代码,就像最初从解释器切换到JIT代码时一样。
就像其他语言可以编译为本地代码一样,例如C,C
++,Fortran;有用于输出JVM字节码的其他语言的编译器。一个示例是scala语言。我相信groovy和jruby也可以转换为Java字节码。
问题内容: Java字节码注入到底是什么?为什么要使用它? 问题答案: Java代码编译为字节码()。字节码注入正在运行时进行修改,以在加载和运行之前立即将代码注入其中。 想象一个场景,我想找出多少次方法 在中被调用。我可以在类加载期间使用该拦截器编写一个代理,然后使用ASM对其进行修改,以便调用方法条目。 现在,我可以运行我的程序了: 并且在运行时,不仅可以完成其正常工作,而且还可以完成我在每次
问题内容: UTF-8是Java中的默认编码吗? 如果没有,我怎么知道默认使用哪种编码? 问题答案: JVM的默认字符集是运行它的系统的默认字符集。对此没有特定的值,并且通常不应将默认编码视为任何特定的值。 可以在运行时通过对其进行访问,尽管这对你有用,但实际上你应该始终在明确指定编码的情况下这样做。
问题内容: 字节码如何在JVM中得到验证? 问题答案: 甲骨文本身有它如何工作的一个小片段页面在这里。 基本上,JRE不信任JDK。那是因为它不知道哪个JDK编译器创建了类文件。它将类文件视为恶意文件,直到通过验证。 对此进行扩展,字节码验证是防止Sun称为“恶意编译器”的必要步骤。Sun自己的Java编译器可确保Java源代码不违反安全规则,但是,当应用程序导入代码片段时,它实际上并不 知道 该
我真的很难理解下面的事情 以前我知道: 当一个Java程序被编译文件。在该代码中是字节的形式。然后将该字节代码转换为机器可理解的格式。 现在我看到SO中的一个问题 实时(JIT)编译器是运行时解释器的一个功能,它不是每次调用方法时都解释字节码,而是将字节码编译成运行机器的机器码指令 因此,这里JIT将字节码转换为机器指令。那么JVM的用途是什么呢。我们可以通过JIT实现这一点。据我所知,JIT只是
问题内容: 我一直在听到所有添加到JVM的新功能,这些功能之一是invokedynamic。我想知道它是什么,它如何使Java中的反射式编程更容易或更好? 问题答案: 这是一条新的JVM指令,它允许编译器生成代码,该代码以比以前更宽松的规范来调用方法-如果您知道“ 鸭子类型 ”是什么,invokedynamic基本上允许进行鸭子类型。作为Java程序员,您可以做的事情太多了。但是,如果您是工具创建