上回听了一堂关于Java动态编译和静态编译的课,觉得自己对这方面了解不多,于是整理下知识点,也上网查了些资料,对Java的动态编译有了一些基础的了解。
Java动态编译器,通常称作即时(Just-in-time,JIT)编译器。程序运行时,JIT 编译器选择将最频繁执行的方法编译成本地代码。运行时再进行本地代码编译而不是在程序运行前进行编译,保证了可移植性的需求。但动态编译可能严重干扰程序操作,因为编译器必须与应用程序共享 CPU。对于Java代码,静态编译可以极大地提高 Java 性能,但同时也带来了很多复杂性。
Java 程序最初是通过 Java SDK 的 javac程序编译成本地的与平台无关的class文件,可将此格式看作 Java 平台,因为它定义了执行 Java 程序所需的所有信息。Java 程序执行引擎,也称作 Java 运行时环境(JRE),包含了为特定的本地平台实现 Java 平台的虚拟机。
尽管通过 JIT 编译保持了平台无关性,但是付出了一定代价。因为在程序执行时进行编译,所以编译代码的时间将计入程序的执行时间。为了克服这个缺点,现代的 JIT 编译器使用了下面两种方法的任意一种(某些情况下同时使用了这两种方法)。第一种方法是:编译所有的代码,但是不执行任何耗时多的分析和转换,因此可以快速生成代码。第二种方法是:将编译资源只分配给少量的频繁执行的方法(通常称作热方法),这种方法有效地实现了编译性能成本的最小化。
动态编译优点:
动态编译能够比静态编译语言更好地生成代码,现代的 JIT 编译器常常向生成的代码中插入挂钩以收集有关程序行为的信息,以便如果要选择方法进行重编译,就可以更好地优化动态行为。比如说收集一个特定 arraycopy操作的长度。如果发现每次执行操作时该长度基本不变,则可以为最频繁使用的 arraycopy长度生成专门的代码,或者可以调用调整为该长度的代码序列。由于内存系统和指令集设计的特性,用于复制内存的最佳通用例程的执行速度通常比用于复制特定长度的代码慢。因为动态编译器通常只是集中编译少量的热方法,所以可以执行更主动的分析来生成更好的代码,使编译的回报更高。事实上,大部分现代的 JIT 编译器也支持重编译被认为是热方法的方法。
动态编译缺点:
大量的初始编译可能直接影响应用程序的启动时间。不仅这些编译延迟了应用程序达到稳定状态的时间,而且在准备阶段中频繁执行的方法可能对应用程序的稳定状态的性能所起的作用也不大。如果 JIT 编译会延迟启动又不能显著改善应用程序的长期性能,则执行这种编译就非常浪费。
其次,有些应用程序完全不能忍受动态编译带来的延迟。如 GUI 接口之类交互式应用程序就是这样的例子。在这种情况下,编译活动可能对用户使用造成不利影响,同时又不能显著地改善应用程序的性能。
最后,用于实时环境并具有严格的任务时限的应用程序可能无法忍受编译的不确定性性能影响或动态编译器本身的内存开销。
因此,虽然 JIT 编译技术已经能够提供与静态语言性能相当的性能水平,但是动态编译并不适合于某些应用程序。
分享到:
相关推荐
JAVA代码反编译工具,把class反编译成.java文件
这篇博客“Java类动态加载(一)——java源文件动态编译为class文件”可能主要探讨了如何在运行时将Java源代码(.java)编译成对应的字节码文件(.class),并将其加载到Java虚拟机(JVM)中。以下是对这个主题的详细解析...
添加动态执行的编译环境 options 是个集合,添加内容,字符集,classpath等 * 6.传入JavaFileObject的java文件,是个集合,创建JavaSourceObject实现这个接口,Kind.SOURCE.extension = '.java' * 7.创建任务并...
Java是一种跨平台的、解释型语言,源代码编译中间“字节码”存储于Class文件中。Class文件是一种字节码形式的中间代码,该字节码中包括了很多源代码的信息,例如变量名、方法名等。 Java代码的反编译 反编译是一个...
SpringBoot 应用动态编译 Java 源码并注入 Spring 容器,实现动态修改接口和抽象类的实现。注意,项目以 Jar 包形式启动时要在命令行引入 tools.jar 的包,IDEA下可直接调试。 基于接口、抽象类实现不停机动态调整...
Java代码反编译工具,如JD-GUI,是开发者在特定场景下不可或缺的辅助工具。在Java编程领域,源代码通常被编译成字节码(.class文件),然后由JVM(Java虚拟机)执行。然而,有时我们可能需要查看已编译的Java类文件...
首先,使用`javac HelloWorld.java`命令将源代码编译成字节码(.class文件),然后使用`java HelloWorld`命令运行程序。对于新手来说,频繁地在代码编辑器和命令行之间切换可能会影响学习效率。 Java代码快捷编译...
在Java的世界里,代码首先会被解释器逐行解释执行,但为了提高性能,JVM会将经常执行的热点代码编译成本地机器码,这个过程就叫做动态编译。 1. **Java字节码与解释执行**: Java源代码经过编译器转化为字节码,这...
在实际应用中,JavaCompiler 广泛应用于 Java 动态编译中,例如,在 Web 开发中,我们可以使用 JavaCompiler 来动态编译 Java 源代码,以便实现更加灵活的开发。 JavaCompiler 是 Java 中的一个重要的编译器接口,...
内存中动态编译执行Java代码是一种高级编程技巧,它允许我们在程序运行时根据需要创建、编译和执行新的Java代码。这种技术在某些场景下非常有用,比如在元编程、插件系统、自定义脚本执行或者代码热更新中。在Java中...
防止JAVA代码被反编译的方法 代码编写避免被反编译的方法
在Java编程中,有时我们需要在运行时动态地编译源代码文件,并将其打包成可执行的JAR(Java Archive)文件。这样的需求通常出现在我们希望根据用户输入或特定条件生成并执行新的代码逻辑时。本教程将深入讲解如何...
在Java编程中,动态编译和运行类是一项重要的技术,特别是在需要实时更新代码或实现热部署的场景下。本文将详细讲解如何在Java中实现动态编译.java源代码文件并执行编译后的类。 首先,我们需要理解Java的编译过程...
用户在页面上编辑的Java代码会被当作字符串处理,这需要我们将其转换为可编译的Java源文件格式。 Servlet是Java Web应用中的服务器端组件,它可以接收HTTP请求,处理数据,并返回响应。在这个案例中,Servlet扮演了...
Java源代码反编译是Java开发中的一种技术,主要用于查看已编译的字节码类文件(.class文件)背后的原始源代码。这对于学习、调试、逆向工程或理解无源代码的第三方库非常有用。在Java开发领域,有时我们可能会遇到只...
Java代码反编译是开发过程中一项重要的技术,它允许开发者查看和理解已编译的Java字节码,以便于学习、调试或者逆向工程。在Java世界里,反编译工具通常被用来从.class文件中恢复出源代码,这对于开源项目、故障排查...
总的来说,JAVA源代码反编译超级引挚 v1是Java开发中的一个重要辅助工具,它有助于开发者理解和分析已编译的Java程序,提升开发效率和问题解决能力。然而,使用这类工具时应尊重软件版权,确保合法合规。