使用实时 Java 进行开发,第 2 部分: 改善服务质量
2009-11-02 00:00:00 来源:WEB开发网这段代码将使 JIT 编译器加载一组类并编译所有这些类的方法。最后一行为应用程序的其余执行部分禁用 JIT 编译器。
与允许 JIT 编译器自由选择将编译哪些方法相比,此方法通常会导致较低的总吞吐量或延迟性能。因为在 JIT 编译器运行之前不必调用方法,JIT 编译器仅拥有少量与如何最佳地优化它要编译的方法相关的信息,所以这些方法的执行速度会更慢。而且,由于编译器被禁用,不会重新编译任何方法,即使这些方法占用了程序执行时间的一大部分,所以,大多数现代 JVM 中使用的这类自适应 JIT 编译框架将不起作用。要减少大量由 JIT 编译器引起的暂停,不是必须使用 Compiler.disable() 命令,但是保留下来的暂停将是在应用程序的热方法上执行的更加频繁的重编译,这通常需要更长的编译时间,对应用程序计时的潜在影响更大。在调用 disable() 方法时,可能不会卸载特定 JVM 中的 JIT 编译器,所以在应用程序运行时阶段,仍然可能消耗内存、加载共享库以及出现其他 JIT 编译器工件。
当然,本机代码编译对各个应用程序的性能的影响程度不尽相同。确定编译是否存在问题的最好方法是打开详细输出,确定编译发生的时间,进而确定它们是否影响应用程序计时。例如,使用 IBM WebSphere Real Time JVM,您可以使用 -Xjit:verbose 命令行选项打开 JIT 详细日志。
除了这种预加载和早期编译方法,应用程序作者无法执行太多操作来避免由 JIT 编译器引起的暂停,但特定于供应商的 JIT 编译器命令行选项除外(一种充满风险的方法)。JVM 供应商很少在生产场景中支持这些选项。由于它们不是默认的配置,所以供应商没有很好地测试它们,它们在各个版本中的名称和含义也可能不同。
但是,一些替代的 JVM 可以为您提供一些选项,具体取决于 JIT 编译器引起的暂停对您有多重要。设计用于硬实时 Java 系统的实时 JVM 提供了更多选项。例如,IBM WebSphere Real Time For Real Time Linux® JVM 具有 5 种代码编译战略,可以将它们与各种功能结合使用来减少 JIT 编译器暂停:
更多精彩
赞助商链接