使用实时Java进行开发,第2部分 改善服务质量 - 编程入门网
充满风险的方法)。JVM 供应商很少在生产场景中支持这些选项。由于它们不是默认的配置,所以供应商没有很好地测试它们,它们在各个版本中的名称和含义也可能不同。
但是,一些替代的 JVM 可以为您提供一些选项,具体取决于 JIT 编译器引起的暂停对您有多重要。设计用于硬实时 Java 系统的实时 JVM 提供了更多选项。例如,IBM WebSphere Real Time For Real Time Linux® JVM 具有 5 种代码编译战略,可以将它们与各种功能结合使用来减少 JIT 编译器暂停: 默认 JIT 编译,JIT 编译器线程在较低优先级上运行 较低优先级上的默认 JIT 编译,在最初使用了提前(Ahead-of-time,AOT)编译代码 在启动时受程序控制的编译,启用了重新编译 在启动时受程序控制的编译,禁用了重新编译 仅 AOT 编译代码 这些选项根据预期的吞吐量/延迟性能级别和预期的暂停时间的降序来排列。默认的 JIT 编译选项使用在最低优先级(可能低于应用程序线程)上运行的 JIT 编译线程,该选项提供了最高的预期吞吐量性能,但也可能显示由(这 5 个选项的)JIT 编译引起的最多的暂停。前两个选项使用异步编译,这意味着如果应用程序线程尝试调用被选择用于重新编译的方法,那么该线程无需等到编译完成。最后一个选项具有最低的预期吞吐量/延迟性能,但没有由 JIT 编译器引起的暂停,因为此方案完全禁用了 JIT 编译器。 IBM WebSphere Real Time for Real Time Linux JVM 提供了一个称为 admincache 的工具,支持创建包含来自一组 JAR 文件的类文件的共享类缓存,也可以在相同代码中存储这些类的提前编译代码。可以在您的 java 命令行设置一个选项,以将存储在共享类缓存中的类从缓存加载到 JVM 中,以及在加载类时将 AOT 代码自动加载到 JVM 中。类似于 清单 2 中所示的类预加载循环已足够确保您充分获取提前编译代码的优势。参见 参考资料,获取 admincache 文档的链接。 线程管理 在交易服务器等多线程应用程序中,控制线程的执行对于消除交易时间的易变性至关重要。尽管 Java 编程语言定义了一种线程模型,该模型包含线程优先级的概念,但实际 JVM 中的线程行为主要由实现定义,包含 Java 程序可以依赖的许多规则。例如,尽管可以为 Java 线程分配 10 个线程优先级中的一个,但这些应用程序级优先级到操作系统优先级值之间的映射是由实现定义的。(对于 JVM,将所有 Java 线程优先级映射到相同的操作系统优先级值是一种非常有效的方法)。出于此原因,Java 线程的调度策略也是由实现定义的,但是通常在最终被分成一些时间段,所以即使是高优先级的线程最终也会与低优先级线程共享 CPU 资源。与较低优先级线程共享资源可能导致在调度较高优先级线程时出现延迟,以让其他任务可以获得一个时间片段。请记住,线程获取的 CPU 量不仅依赖于优先级,还依赖于需要调度的线程总数。除非可以严格控制在任何给定时间有多少活动线程,否则,即使是最高优先级线程用于执行操作的时间也可能出现相对较大的差异。 所以,即使您为工作者线程指定最高的 Java 线程优先级(java.lang.Thread.MAX_PRIORITY),也不会提供与系统上较低优先级任务之间太高的隔离级别。不幸的是,除了使用固定的工作线程集(不继续分配新线程,而依赖于 GC 收集未使用的线程,或者扩大和缩小线程池)并尝试将在应用程序运行时系统上低优先级活动的数量减到最少,您无法采取其他更多措施,因为标准 Java 线程模型未提供控制线程行为所需的工具。在这里,即使是软实时 JVM(如果它依赖于标准 Java 线程模型)也不能经常提供帮助。 但是,与标准 Java 相比,支持 Real Time Specification for Java (RTSJ) 的硬实时 JVM(比如 IBM WebSphere Real Time for Real Time Linux V2.0 或 Sun 的 RTS 2 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |