实时Java,第1部分: 使用Java语言编写实时系统 - 编程入门网
的区域),而不需要进行压缩。
与传统的 STW 垃圾收集器实现不同,Metronome 在整个应用程序生存期内连续执行 GC 过程,而前者则使用 GC 周期的概念表示垃圾收集的开始和结束。在整个应用程序生存期内,都保证了应用程序的 utilization,其值要高于不需要进行太多的 GC 工作情况下 utilization 的最小值。随着收集器将找到的自由内存返回给应用程序,自由内存量不断上下变化。 RT 中的本地代码编译 大多数现代 JVM 结合使用了解释和编译的代码执行。为了消除解释的高性能代价,JIT 编译器选择将频繁执行的代码直接转换为 CPU 的本地指令。Java 语言的动态特性通常会将编译器的操作作为程序执行,而不是作为发生在程序运行前的一个步骤(C++ 或 Fortran 语言中就属于后一情形)。JIT 编译器将选择它要编译的代码,这样它花费的编译时间很可能通过对代码性能的改进得到补偿。在动态编译行为的最顶层,传统 JIT 编译器使用了大量的推测性优化,这些优化利用了正在运行程序的动态特性,这对于应用程序执行的某个阶段中的一点也许是正确的,但是不一定适合整个应用程序的执行阶段。如果对于该特性的假设稍后变为错误,那么这种优化是 “未完成的”。 在传统的非 RT 环境中,在程序执行时编译代码效果非常好,因为大部分的编译器操作对应用程序性能是透明的。然而,在 RT 环境中,JIT 编译器引入了不可预知的运行时行为,这将严重影响最坏情况时执行时间分析。但是这种环境中,编译的代码的性能优势仍然非常重要,因为它能够使更复杂的任务在较短的时间内完成。 WebSphere Real Time 引入了两种解决方案在不同的折中点平衡这两种需求。第一个解决方案是使用 JIT 编译器,在较低的非 RT 优先级上运行,它已被修改为很少执行主动的推测性优化。非 RT 优先级的操作使操作系统保证编译器不会干扰 RT 任务的执行。但是,代码性能会随时间改变这一事实是一种不确定影响,这使得这种解决方案更适合于软 RT 环境而不适合硬 RT 环境。 对于硬 RT 环境来说,WebSphere Real Time 引入了 AOT,用于应用程序编程。存储在 JAR 文件中的 Java 类文件可以通过简单的命令行预编译为 Java eXEcutable (JXE) 文件。通过将这些 JXE 文件(而不是原始的 JAR 文件)指定到应用程序类路径中,将能够使应用程序得到调用,因此就执行了 AOT 编译的代码 —— 而不是经解释过的字节码或 JIT 编译器编译过的本地代码。在第一个 WebSphere Real Time 发布版中,使用 AOT 代码意味着没有使用 JIT 编译器,这样有两个主要的好处:更低的内存消耗以及不会受到来自 JIT 编译线程和样例线程的动态性能影响,这些线程用来标识频繁执行的代码。 实时Java,第1部分: 使用Java语言编写实时系统(6)时间:2011-06-22 Mark Stoodley Mike图 5 展示了在使用 AOT 代码时,在 WebSphere Real Time 中如何执行 Java 代码: 图 5. 如何使用 AOT 代码 首先看图 5 的左上方,和任何 Java 开发项目一样,开发人员将 Java 源代码编译成类文件,类文件被绑定到 JAR 文件,然后由 AOT 使用 jxeinajar 工具对其进行编译。这个工具可以编译 JAR 文件中所有类的所有方法,也可以根据一个基于 JIT 的样例程序的执行输出选择性地编译某些方法,这个程序标识了需要编译的最重要的方法。jxeinajar 工具编译 JAR 文件中的方法并构造一个 JXE 文件,后者包含原始 JAR 文件的内容以及 AOT 编译器生成的本地代码。在执行程序时,JXE 文件可以直接取代 JAR 文件。如果使用 -Xnojit 选项调用 JVM,那么将加载类路径中 JXE 文件的 AOT 编译的代码(根据 Java 语言的规则)。在程序执行期间,将对从 JAR 文件加载的方法或者从 JXE 文件加载的未经编译的方法进行解 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |