实时Java,第5部分 - 编写和部署实时Java应用程序 - 编程入门网
GC 暂停的问题提供了多种解决方案。它使 Java 程序员了解到自动内存管理的重要性,也引入了新的存储区,避免了要求程序员重新接管内存的 GC 影响。如介绍 NoHeapRealtimeThread 的一节所述,这会带来一些挑战,提高编写可靠 Java 应用程序的门槛。还有一种替代方案,适用于许多可以容忍极短暂停的 RT 应用程序,也就是使用一种 RT 垃圾收集器,例如 WebSphere Real Time 中的 Metronome。
使用 Metronome 运行 Lunar Lander 应用程序会将登月舱引领到更贴近正确位置的地方,而在高度度量中不会产生任何显著峰值,保证每次都安全着陆(参见图 3)。 图 3. 使用 WebSphere Real Time 的 Controller 的模拟 实时Java,第5部分 - 编写和部署实时Java应用程序(3)时间:2011-06-22 Caroline Gough在这次也就是第二次运行中,Controller 的 Java 代码保留原样,这是一个收益于 RT 垃圾收集器的普通 J2SE 应用程序。 可以为示例的调用添加 -verbose:gc 参数,以显示减少的 GC 暂停的细节,如以下输出所示:
这个示例输出报告了演示程序的一次运行内为时 1 秒的间隔内的 GC 活动。此处显示出 GC 运行了 171 次(quantumcount),还给出了应用程序从这些增量式 GC 暂停中得到的平均暂停时间(meanms)是 0.470 毫秒。 关于应用程序工作与 GC 暂停间交错的更具体观点,可录制一份 Metronome 跟踪文件,并用 TuningFork 分析工具查看(参见 参考资料),如图 4 所示: 图 4. 部分演示程序在 TuningFork 中的显示效果 一旦 GC 暂停被最小化,其他可能给一个运行中的应用程序造成干扰的因素就变得重要起来。其中之一就是即时(JIT)编译器的活动。将 Java 字节码编译成本地文件实际上是为了获得更好的性能,但生成本地代码时可能会导致暂停。此问题的解决方案之一是使用 AOT 编译预先编译 Java 字节码。 实时Java,第5部分 - 编写和部署实时Java应用程序(4)时间:2011-06-22 Caroline Gough应用程序的 AOT 编译 Java 运行时通常使用一个 JIT 编译器,为一个 Java 应用程序内执行最频繁的方法动态生成本地代码。在 RT 环境中,有些应用程序(比如说有着严格的截止日期的应用程序)可能无法容忍与动态编译活动相关的不确定性。而对于其他一些应用程序,编译众多用于启动一个复杂应用程序的负载也是不合人意的。面临这些问题的应用程序开发人员能够受益于使用 AOT 编译。 AOT 编译涉及到在应用程序执行前为应用程序的 Java 方法生成本地代码。这使用户能够避免动态编译的不确定性,同时又能获得与本地编译相关的最大性能收益。有必要了解,通常运行 AOT 编译(也称为预先编译)的代码要比用动态 JIT 编译器时稍慢。预先编译的代码有着静态的本质 —— 与 JIT 编译器动态生成的代码不同,因而不可能在经过一段时间后,得益于常用方法的进一步优化。WebSphere Real Time 目前不允许混合使用动态 JIT 编译和预先编译的代码。总之,AOT 编译能够以更低的运行时影响提供更确定的运行时性能,原因就是未出现动态编译,而通过支持动态解 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |