网站用什么做内网穿透比较好,义乌缔造网络科技有限公司,上海网站建设制作公,微生成网站zing jvmJava虚拟机#xff08;JVM#xff09;提供了托管运行时环境#xff0c;用于安全部署应用程序#xff0c;其性能通常可以超过本机编译语言#xff08;如C和C #xff09;。 通过即时#xff08;JIT#xff09;编译进行垃圾回收和自适应编译的内存管理是两个最突… zing jvm Java虚拟机JVM提供了托管运行时环境用于安全部署应用程序其性能通常可以超过本机编译语言如C和C 。 通过即时JIT编译进行垃圾回收和自适应编译的内存管理是两个最突出的功能。 尽管使用字节码和JIT编译可以提供更好的峰值性能但是对于某些类型的应用程序达到该级别所需的预热时间可能会成问题。 在本文中我们将研究Azul作为Zing JVM的一部分开发的一组技术以解决这些限制。 首先让我们看一下在JVM上运行时应用程序性能的典型图表。 该图并不理想因为应用程序开始时性能降低并且JVM需要时间才能发挥其全部潜能。 该图可以分为三个不同的部分 让我们看一下JVM内部发生的每种情况。 当应用程序启动时JVM必须加载并初始化必要的类。 完成此操作后JVM将在main入口点开始执行。 由于JVM是虚拟机 因此它不会使用与运行它的物理机相同的指令集。 因此有必要将类文件的字节码转换为物理CPU的指令集。 这称为字节码解释 。 必须对每个执行的字节码重复此操作这会导致性能比本地编译的应用程序低得多。 这在很大程度上是因为Java首次发布时缓慢的声誉。 上图以黄色显示了已解释的模式。 为了减轻在解释模式下运行的问题JVM在内部记录了每种方法调用频率的统计信息。 这样它就可以为重复调用的方法例如长时间运行的循环中的代码识别热点 因此称为Oracle JVM。 当方法调用计数达到定义的阈值时JVM将方法传递给内部编译器该编译器称为即时编译器通常称为JIT。 JVM在此阶段使用的编译器称为C1以前也称为客户端编译器。 C1 JIT旨在尽快生成代码以便快速提高这些方法的性能。 为此C1将仅应用最简单的优化这些优化不需要其他配置数据或需要很长时间才能生成。 如上图的绿色部分所示随着编译更多方法性能逐渐提高。 在此代码运行时JVM将收集有关如何使用该方法以及如何执行代码的全面分析数据。 在调用方法的次数达到第二个阈值时JVM将使用其他JIT编译器重新编译该方法。 在Zing的情况下这是基于开源LLVM项目的Falcon JIT。 默认的OpenJDK二级JIT编译器为C2它非常旧且难以增强。 Falcon是比C1更复杂的编译器。 它使用在执行C1生成的代码期间收集的概要分析数据以及JVM中的其他内部数据将最大程度的优化应用于其生成的代码。 这是图表的蓝色部分一旦所有常用方法都已编译性能最终将达到最高水平。 此时该应用程序被视为已预热 。 现在我们了解了JIT编译在JVM中的工作方式可以采取哪些措施来减少其对应用程序启动性能的影响 Azul开发了两种技术使Zing JVM能够减轻预热效果。 关于如何解决此问题的一个常见建议是让应用程序运行直到所有常用的方法都已JIT编译然后让JVM将已编译的代码写入文件中。 重新启动应用程序后可以重新加载以前编译的代码并且应用程序将以停止之前的速度运行。 听起来不错的解决方案但有两个重大缺点 尽管代码是为正在运行的应用程序编译的但是不能保证在重新启动JVM时它仍然有效。 为何使用断言是一个很好的例子。 如果在禁用断言的情况下运行应用程序则JIT将消除代码的相关部分。 如果随后在启用断言的情况下重新启动应用程序并使用先前编译的代码则断言将丢失。 有一个关于JVM必须如何工作的精确定义这就是JVM规范。 它包含在Java SE规范中该规范是根据JCP在相关JSR中创建的。 这定义了当JVM运行应用程序时必须执行的特定任务。 必须先显式加载和初始化类然后才能使用它们。 同样如果使用了先前编译的代码这可能会使JVM的正确操作无效。 Azul的ReadyNow 技术采用了另一种方法可以确保正在执行的代码和JVM的启动顺序都完全正确。 要实现此ReadyNow 记录正在运行的应用程序的配置文件。 可以随时获取配置文件以便用户可以决定他们的应用程序何时以所需的级别运行。 可以拍摄多个配置文件快照以便用户可以在重新启动应用程序时选择所需的配置文件。 该配置文件记录五段数据 已加载的所有类的列表。 已初始化的所有类的列表。 在执行C1 JIT编译代码期间收集的概要分析数据。 C1和Falcon JIT均执行编译。 失败并导致代码未优化的推测优化列表。 再次启动应用程序时此数据将用作JVM的高级知识以执行以下步骤 加载配置文件中列出的所有引导程序和系统类。 初始化那些已加载类的安全子集。 被认为是安全的类是JMV规范允许的类。 确定所需的类加载器后将立即加载配置文件中的其他类。 如前所述由于Java平台的动态特性这是必需的。 概要分析和推测性优化数据用于使用Falcon JIT编译所需的方法。 所有这些都在应用程序在main入口点开始执行之前发生。 这样的效果是当应用程序开始执行时几乎所有热门方法都已使用Falcon JIT进行了编译。 通过使用概要分析数据可以对代码进行大量优化并使用已知有效的推测性优化也可以避免不必要的优化。 性能始于非常接近收集概要文件时的水平。 由于此过程的工作方式受到一些限制因此应用程序通常仅需要执行少量事务即可使其全速运行。 但是此方法确实会产生影响。 在应用程序何时可以开始处理事务之前JVM还有很多工作要做。 为了减轻这种影响Azul开发了Compile Stashing 正如我们已经看到的在重新启动应用程序时不可能简单地保存已编译的代码然后重新加载它。 但是可以保存已编译的代码并将其实际上用作高速缓存。 方法的字节码与保存的性能分析数据组合在一起因此可以将它们转换为编译器使用的中间表示IR。 在编译代码时JIT将调用JVM以帮助其做出有关可以使用的优化的决策。 例如要确定是否可以内联方法JIT必须首先确定该方法是否可以进行虚拟化这需要查询JVM。 JIT完成对方法的分析后便可以最大程度的优化对其进行编译。 这个过程是完全确定的。 给定相同的方法字节码和配置文件数据作为输入以及对JVM的相同查询集JIT编译器的输出将始终相同。 编译存储补充ReadyNow 除了记录配置文件外还将当前编译方法的本机代码以及VM回调的查询和响应写入文件。 当应用程序再次启动时ReadyNow 像以前一样根据配置文件加载并初始化可以的类。 但是保存的已编译方法现在用作缓存以减少对显式编译的需求。 操作流程图如下所示 好了 将IR用于方法的字节码并查询编译期间使用的VM的组合以确定存储的编译代码是否匹配。 如果是这样则可以从“编译存储区”返回该代码。 如果由于某种原因输入与编译请求不匹配则可以像以前一样将其传递给Falcon JIT。 重要的是要注意使用此技术不会使JVM规范中有关应用程序初始化的任何要求无效。 测试表明使用“编译存储”ReadyNow需要的编译时间 最多可减少80并减少60的CPU负载。 如您所见ReadyNow 和Compile Stashing通过记录类加载和性能分析数据无效的推测性优化以及已编译的代码来解决应用程序预热时间的问题。 重新启动应用程序时使用所有这些组件可以大大减少应用程序达到最佳性能水平所需的时间和CPU负载。 Zing是启动速度快保持速度快且运行速度更快的JVM。 准备开始使用更好的JVM了吗 在您选择的Linux发行版上尝试Zing Free ... 翻译自: https://www.javacodegeeks.com/2019/06/faster-jvm-application-warm-zing.htmlzing jvm